批发部:VC中rect VC 控件及屏幕坐标获得设置

来源:百度文库 编辑:中财网 时间:2024/04/30 20:41:01
rect和rgn有什么差别
RECT是结构体,表示一个矩形区域,里面有两个坐标信息,分别是左上角和右下角的两个点的信息,在这两个点之间形成一个矩形区域。
RGN  也是代表一个区域,默认情况下是一个矩形区域,但在程序使用时,有时候不想它是一个矩形区域,可以使它成为任意的一个区域,这时就要用到RGN  1、GetClientRect()得到的是:{top=0   bottom=110 left=0
      right=364得到的是控件内部的可绘制区,加上边框的大小就是整个控件的大小
      GetWindowRect()得到的是:{top=63 bottom=177 left=182
      right=550}//这个是控件相对于对话框的位置和大小
      2、资源里用字体单位来表示大小,窗口函数中用像素来表示。其关系可以用
      MapDialogRect
      来转换。或者用GetDialogBaseUnits获得对话框单位大小。
      3、ClientToScreen 和 ScreenToClient
      函数功能:
      ClientToScreen函数将指定点的用户坐标转换成屏幕坐标
      ScreenToClient把屏幕上指定点的屏幕坐标转换成用户坐标。 
      例如:想要得到文本框在对话框中左上角的坐标(即文本框左上角到对话框左上角的距离)  
         
         
          CRect     rectEdit,rectDlg;  
          CWnd     *pWnd=GetDlgItem(IDC_EDIT1);//获得文本框指针  
          pWnd->GetClientRect(rectEdit);       //获得文本框矩形,左上角坐标(0,0)  
          pWnd->ClientToScreen(rectEdit);       //转换到屏幕坐标,左上角坐标为文本框在屏幕的坐标  
          GetClientRect(rectDlg);//获得对话框矩形,左上角坐标(0,0)  
          ClientToScreen(rectDlg);//转换到屏幕坐标,左上角坐标为对话框在屏幕的坐标  
         
          int     x=rectEdit.left-rectDlg.left;//他们的差即为文本框在对话框中的X坐标  
          int     y=rectEdit.top-rectDlg.top;//他们的差即为文本框在对话框中的Y坐标  
      再如:
      ClientToScreen( )是把窗口坐标转换为屏幕坐标
      ScreenToClient( )是把屏幕坐标转换为窗口坐标
      屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的
      VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。
      一个窗体分为两部分:系统区和客户区
      象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!
      Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是
      系统区的啦!!!
      ClientToScreen是把坐标从当前窗体转化成全屏幕的!!!
      ScreenToClient是把屏幕坐标转化成相对当前窗体的坐标!!!!      bool   m_bIsLButtonDawn =false;      void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
      {
       // TODO: Add your message handler code here and/or call default
       CWnd *pwnd=GetDlgItem(IDC_EDIT1);
           CDC *pdc=pwnd->GetDC();
       CRect rect;
       this->ClientToScreen(&point);
       pwnd->ScreenToClient(&point);
       pwnd->GetClientRect(&rect);      //   HCURSOR hcur=::LoadCursorFromFile("pen.cur");
       //   SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)hcur);        // CPen pen(PS_INSIDEFRAME,-1,RGB(255,255,255));
      //      CPen* olePen=pdc->SelectObject(&pen);
       if(rect.PtInRect(point) &&   m_bIsLButtonDawn )
       {         pdc->DPtoLP(&m_fp);
         pdc->MoveTo(m_fp);
         pdc->DPtoLP(&point);
         pdc->LineTo(point);       }
         m_fp=point;
      //   pdc->SelectObject(olePen);
       ReleaseDC(pdc);
       CDialog::OnMouseMove(nFlags, point);
      }      void CDrawDlg::OnLButtonUp(UINT nFlags, CPoint point)
      {
         m_bIsLButtonDawn =false;
       // TODO: Add your message handler code here and/or call default
      /**//*
          CWnd *pwnd=GetDlgItem(IDC_EDIT1);
            CDC *pdc=pwnd->GetDC();
         CRect rect;
         this->ClientToScreen(&point);
         pwnd->ScreenToClient(&point);
         pwnd->GetClientRect(&rect);
       
         if(rect.PtInRect(point))
         {
          pdc->DPtoLP(&m_fp);
          pdc->MoveTo(m_fp);
          pdc->DPtoLP(&point);
          pdc->LineTo(point);
      
         }
         ReleaseDC(pdc);*/
      
       CDialog::OnLButtonUp(nFlags, point);
      }      void CDrawDlg::OnLButtonDown(UINT nFlags, CPoint point)
      {
       // TODO: Add your message handler code here and/or call default
       CWnd *pwnd=GetDlgItem(IDC_EDIT1);
       CDC *pDC=pwnd->GetDC();
       CRect rect;
       this->ClientToScreen(&point);
       pwnd->ScreenToClient(&point);
       pwnd->GetClientRect(&rect);
       if(rect.PtInRect(point))
       {
         m_fp.x=point.x;
         m_fp.y=point.y;
       }
       ReleaseDC(pDC);
         m_bIsLButtonDawn =true;
       CDialog::OnLButtonDown(nFlags, point);
      }