1、GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。
2、GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。
3、ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.
4、ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.
我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系(这样就可以得到一个控件在该客户坐标系下的坐标)。而通过 GetClientRect取得一个RECT,再用ClientToScreen转换就可以得到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于 GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。
注意:
对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。
对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。
5、MFC多数方法传入的point,他们的取值为相对的坐标(以当前窗口左上点为基点的相对坐标)
void CDlgSelectCity::OnLButtonDown(UINT nFlags, CPoint point)
转换为windows的坐标,使用ClientToScreen,把相对于窗口的坐标转换为以当前屏幕的左上点为基点的坐标
ClientToScreen(&point);
+ point {x=489 y=132} CPoint 转换前相对于窗口的坐标
+ screentPoint {x=678 y=251} CPoint 转换后相对于屏幕的坐标
6. GetCursorPos所获取到的坐标,为以屏幕左上点为基点的坐标
POINT apoint;
GetCursorPos(&apoint);
+ apoint {x=678 y=251} tagPOINT
7、应用场景:坐标系转换
当在对话框中创建一个组件A的时候,如果参考对话框中的另一组件B位置,我们可以使用GetWindowRect获得B组建的屏幕坐标,再通过ScreenToClient获取区域坐标。区域坐标就可以用于创建组件A。(例如:RDMS中的精简模式下的“断开”按钮)。
设置坐标映射
(1)Windows坐标系统
Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。
<1>逻辑坐标系是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。
<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能表示的最小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点位置(0, 0)不限定在设备显示区域的左上角。
设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。
屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。
窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。
客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
(2)坐标之间的相互转换
编程时,有时需要根据当前的具体情况进行三种设备坐标之间或与逻辑坐标的相互转换。
MFC提供了两个函数CDC::DPtoLP()和CDC::LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。
MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。
参考如下:http://www.cnblogs.com/weiqubo/archive/2009/12/24/1930029.html