新建一个对话框,添加一个按钮button1,为其添加响应函数:void CDlgDlg::OnButton1() 
{
    CString str;
    CRect rt;
   GetWindowRect(rt);
  str.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
  MessageBox(str);
        
    ScreenToClient(rt);
    CString str2;
    str2.Format("%d\n%d\n%d\n%d",rt.left,rt.top,rt.right,rt.bottom);
    MessageBox(str2);经过ScreenToClient(rt);转换后rt.left,rt.top的值居然为一个负数,这是为什么?
msdn的解释为:
说明:
将显示器上给定点或矩形的屏幕坐标转换为客户坐标。
ScreenToClient成员函数将lpPoint或lpRect给定的屏幕坐标替换为客户坐标。新的坐标是相对于CWnd客户区的左上角的。想了半天实在是找不出左上角点坐标为负数的解释?另外还有一个问题:把以上代码放到OnInitDialog()函数中执行的话,rt.left,rt.top的值为0,0,合理的解释是对话框在OnInitDialog()函数执行的时候还没有创建,但是
rt1.Width(),rt1.Height()执行这个话,却又能够得到正确的值,这也就推翻了刚才的那个合理的解释,因为要是对话框在OnInitDialog()函数执行的时候还没有创建,那么对话框的高和宽,即:rt1.Width(),rt1.Height()这两个值从何而来?
一句话:rt.left,rt.top的值为什么0,0,?

解决方案 »

  1.   

    1. GetWindowRect获取的是整个窗口相对于桌面的rect,而Client坐标不包括非客户区
    2. 你说那个rt的left和top是0,ScreenToClient之前的还是之后的
      

  2.   

    你的GetWindowRect得到的不是按钮的大小,是整个窗口的,用::GetWindowRect(HWND,&RC);得到
    负数有时候是有的边框的问题,0,0是正常的,自己对自己当然是0,0
      

  3.   

    1. GetWindowRect获取的是整个窗口相对于桌面的rect,而Client坐标不包括非客户区你说的负数应该是在你对话框的上方的区域,
    也就是你的Rect其实是大于你的client的区域的。
      

  4.   

    屏幕坐标跑出client区域了。client区域左上坐标为(0,0),你自己就可以推算了。
      

  5.   

    1、有边缘厚度。
    2、rt的left和top是0,ScreenToClient之前的还是之后的?
      

  6.   

    GetWindowRect(rt);//获得的就是客户区的区域坐标,(L,T,R,B);
    ScreenToClient(rt);//将客户区坐标做为屏幕区再转客户区,L,T就可能为负,除非你将客户区移到屏幕左上角
    你应该用:
    ClientToScreen(rt);//这样rt就是客户区相对于屏幕的坐标了