关于ClientToScreen、ScreenToClient、GetClientRect和GetWindowRect四个函数之间的关系

来源:互联网 发布:unity3d如何导入模型 编辑:程序博客网 时间:2024/05/22 04:51

 对于这四个函数,想必有部分人还不知道其真正的原理吧.今天我也着实总结下:

GetClientRectGetWindowsRect两者之间的关系:

GetClientRectCRect是相对它的窗口的客户区的原点而言的,即它的左上角坐标总是(0,0),大小总是客户区的长宽。

GetWindowRect得到的CRect则是相对于屏幕坐标而言的,它的左上角坐标就是窗口在屏幕上的左上角坐标,它的大小就是整个窗口的大小。 

ClientToScreenScreenToClient两者之间的关系:

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里面将控件的相对于对话框的大小调解下.(这里主要注意不变量,一般是控件的大小不变,只改变位置).

 

原创粉丝点击