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的坐标位置吗?
m_ctlTestingButton.ScreenToClient ((LPRECT) & pOldRect);
或者
m_ctlTestingButton.GetClientRect ((LPRECT) & pOldRect);
为什么我调用这3个函数后pOldRect的left,top值都是0.难道pOldRect的内容不是button的left,right,top,bottom的坐标位置吗?
改成ScreenToClient ((LPRECT) & pOldRect);
试试看。
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)