VC控件坐标与屏幕坐标

1、GetClientRect()得到的是:{top=0  bottom=110 left=0 right=364得到的是控件内部的可绘制区,加上边框的大小就是整个控件的大小
GetWindowRect()得到的是:{top=63bottom=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;

voidCDrawDlg::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);
}

voidCDrawDlg::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);
}

voidCDrawDlg::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);

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值