对于这四个函数,想必有部分人还不知道其真正的原理吧.今天我也着实总结下:
GetClientRect和GetWindowsRect两者之间的关系:
GetClientRect的CRect是相对它的窗口的客户区的原点而言的,即它的左上角坐标总是(0,0),大小总是客户区的长宽。
GetWindowRect得到的CRect则是相对于屏幕坐标而言的,它的左上角坐标就是窗口在屏幕上的左上角坐标,它的大小就是整个窗口的大小。
ClientToScreen和ScreenToClient两者之间的关系:
ClientToScreen,可以把一个CPoint对象或CRect对象的坐标从客户区坐标系(以客户区左上角为原点)变换为屏幕坐标系(以屏幕左上角为原点)。
如:
// 把对话框的大小变成客户区的大小
void CAboutDlg::OnButton1()
{
//1.通话GetClientRect来获取窗体的矩形区域
CRect myRect;
GetClientRect(&myRect);//取得客户区的大小
ClientToScreen(myRect);//转换为屏幕坐标
MoveWindow(myRect.left, myRect.top,
myRect.Width(), myRect.Height());//MoveWindow使用的是屏幕坐标
}
ScreenToClient,则可以把一个CPoint对象或CRect对象的坐标从屏幕坐标系变换为客户区坐标系。
例如:
CPoint pos( ::GetMessagePos() ); //::GetMessagePos() 得到发生事件时鼠标屏幕坐标 ScreenToClient(&pos);//把它转换为客户区坐标以便随后在绘图时使用
另外,我们经常需要对对话框进行拉伸.在其拉伸的过程中总会牵涉到一些控制的摆放问题,这里我给出我的一点经验:
首先使用以下语句就可以得到控件相对于客户端的位置(这个位置前面已经说得很清楚了)
m_value.GetWindowRect(LPRECT);//获取窗体的矩形区域
ScreenToClient(LPRECT);//从屏幕转为客户端
m_value.MoveWindow(LPRECT);
在获取对话框的大小.计算一下控件距对话框的某一边的长宽度.
每当对话框拉伸的话,在onSize里面将控件的相对于对话框的大小调解下.(这里主要注意不变量,一般是控件的大小不变,只改变位置).