((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
ScreenToClient(&rs);
算的结果为什么不一样呢
都怎么算的?

解决方案 »

  1.   

    GetWindowRect 返回坐标相当于整个屏幕 GetClientRect 返回控件自身大小
      

  2.   

    再调用ScreenToClient(&rs);这个函数转换时,整个窗口往右上角移,GetWindowRect(&rs)会得到控件在窗口的坐标,GetClientRect(&rs)减去往右上角移动相应的距离
      

  3.   

    ScreenToClient(&rs); 在哪里调的,是不是MFC的CDialog中,那么ScreenToClient的主体是CDialog吧,是否应该是
    ((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(rs.TopLeft()); 
    ((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(rs.BottomRight()); 
      

  4.   

    按你这么说
    ((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

    ((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
    ScreenToClient(&rs);
    应该是一样的了
      

  5.   

    3楼说的对,ScreenToClient的使用跟调用它的窗口有关系 
    你要是这样((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(&rs);应该就是相同的值了。
    你这样ScreenToClient(&rs);默认的是对话框调用,返回的应该是Static相对于对话框窗口的位置了。
      

  6.   

    不一样啊,,GetClientRect(&rs)这个是你得到的是IDC_STATIC的距形区域,top 和left 是0,经过ScreenToClient(&rs)(也就是减去窗口往上移动的距离)后就变成负数了,而GetWindowRect(&rs)这个得到的是IDC_STATIC控件从窗口右上角开始计算,所在距形区域,,如果还不明白,你在那里设置一个断点,得到的值,再看这个啊
      

  7.   

    ((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
    ScreenToClient(&rs); 
    这个得到的才是控件在父窗口的位置。((CStatic*)GetDlgItem(IDC_STATIC))->GetClientRect(&rs);

    ((CStatic*)GetDlgItem(IDC_STATIC))->GetWindowRect(&rs);
    ((CStatic*)GetDlgItem(IDC_STATIC))->ScreenToClient(&rs);
    是一样的效果,但是没什么用。结贴~