m_ctlTestingButton.GetWindowRect((LPRECT) & pOldRect);
m_ctlTestingButton.ScreenToClient ((LPRECT) & pOldRect);
或者
m_ctlTestingButton.GetClientRect ((LPRECT) & pOldRect);
为什么我调用这3个函数后pOldRect的left,top值都是0.难道pOldRect的内容不是button的left,right,top,bottom的坐标位置吗?

解决方案 »

  1.   

    m_ctlTestingButton.ScreenToClient ((LPRECT) & pOldRect);
    改成ScreenToClient ((LPRECT) & pOldRect);
    试试看。
      

  2.   

    你用
    m_ctlTestingButton.GetClientRect ((LPRECT) & pOldRect);
    得到的RECT的top和left一定是0,因为这个函数得到的RECT是以按钮控件(其实按钮控件也
    是一个窗体,因为CButton由CWnd继承而来)的Window Rect定坐标系的.也就是说,按钮控件
    的左上角是(0,0),向右为X正,向下为Y正,而并不是以整个窗体为坐标系的.你当然得不到按
    钮相对于窗体的位置信息了.而
    m_ctlTestingButton.GetWindowRect((LPRECT) & pOldRect);
    可等价于下面两句话:
    m_ctlTestingButton.GetClientRect((LPRECT)rect);
    m_ctlTestingButton.ClienttoScreen((LPRECT)rect);而
    ScreenToClient ((LPRECT) & pOldRect);
    这个函数只是由于坐标转换,自然也不能得到按钮相对于窗体的位置信息.
    而且你((LPRECT) & pOldRect)的写法似乎也有问题.正确的用法应该是:CRect rect;
    CRect rectDlg;//
    m_ctlTestingButton.GetClientRect(&rect);
    m_ctlTestingButton.ClientToScreen(&rect);
    //此两句或由m_btn.GetWindowRect(&rect)代替.GetClientRect(&rectDlg);
    ClientToScreen(&rectDlg);
    CRect rectBtn(
                  rect.left-rectDlg.left,
                  rect.top-rectDlg.top,
                  rect.left+rect.Width(),
                  rect.top+rect.Height()
                 );//这个就是你要的rect
    其原理就是分别得到按钮和窗体的"屏幕坐标"(这个坐标以屏幕为坐标系,
    与各个窗体无关,是统一的),再根据二者左上角坐标之差即可得到按钮相对
    于窗体的坐标.(若有谬误,请各路高手指正. Zero回, 3/28/2003)