一、GetWindowRect和GetClientRect介绍
GetWindowRect
函数功能:返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。
函数原型:
void GetWindowRect(
LPRECT lpRect
) const;
参数:
lpRect:指向一个CRect对象或者RECT结构指针,用来接收左上和右下角的屏幕坐标。
返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。
备注:复制CWnd对象的外界矩形的尺寸到指向lpRect的结构。尺寸是在屏幕坐标相对显示屏幕左上角给出的,包含已经存在的标题、边框和滑动条尺寸。
GetClientRect
函数功能:取回客户区坐标。
函数原型:
BOOL GetClientRect(
LPRECT lpRect
) const throw();
参数:
lpRect 指向一个RECT结构或一个CRet对象,用来取回客户坐标。left和top成员是0,right和bottom成员包含窗口的宽和高。
备注:复制CWnd客户区域的客户坐标到lpRect指向的结构。客户坐标指定客户区域的左上和右下角。囿于客户坐标相对CWnd客户区域的左上
角,左上角的坐标是(0,0)。
二、GetWindowRect和GetClientRect的异同
1、
GetWindowRect获得的是在屏幕坐标系下的尺寸,即以屏幕左上角为原点,得到的结果可能是CRect(10,23,234,332)
GetClientRect,获得的是在客户区坐标系下的尺寸,即以所在窗口左上角为原点,得到的结果CRect(0,0,width,height)即左上角坐标(x,y)
只能是(0,0)。
2、
两者得到的尺寸都包含窗口或控件的标题、滑条、边框尺寸。这也使得两者转换成为可能。
三、GetWindowRect和GetClientRect的转换
1、
CWnd::ClientToScreen
需要包含头文件afxwin.h。
函数原型:
void ClientToScreen(
LPPOINT lpPoint
) const;
void ClientToScreen(
LPRECT lpRect
) const;
2、
ScreenToClient
需要包含头文件afxwin.h。
结构原型:
void ScreenToClient(
LPPOINT lpPoint
) const;
void ScreenToClient(
LPRECT lpRect
) const;
附:LPPOINT结构和LPRECT结构定义
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
四、示例
// resize dialog to client's size
void CMyDlg::OnSizeToClient()
{
CRect myRect;
GetClientRect(&myRect);
ClientToScreen(myRect);
MoveWindow(myRect.left, myRect.top,
myRect.Width(), myRect.Height());
}
参考资料:MSDN