WinApi中的GetClientRect和GetWindowRect有啥区别?

Posted

技术标签:

【中文标题】WinApi中的GetClientRect和GetWindowRect有啥区别?【英文标题】:What is the difference between GetClientRect and GetWindowRect in WinApi?WinApi中的GetClientRect和GetWindowRect有什么区别? 【发布时间】:2011-11-25 12:55:58 【问题描述】:

我应该在 InvalidateRect 中使用哪些来刷新我的窗口?为什么?

【问题讨论】:

【参考方案1】:

窗口矩形包括非客户区,即窗口边框、标题栏等。客户端矩形不包括。

GetWindowRect 在屏幕坐标中返回一个矩形,而GetClientRect 在客户端坐标中返回一个矩形。

InvalidateRect 在客户端坐标中接收到一个矩形。如果要使整个客户区无效,请将NULL 传递给InvalidateRect。你可以传入GetClientRect返回的rect,但传递NULL要简单得多。

【讨论】:

【参考方案2】:

一个非常简单的解释是GetWindowRect() 为您提供了包含窗口边框的矩形。 GetClientRect() 为您提供不包括边框的矩形 - 分配给窗口特定绘图的区域。

请注意GetWindowRect() 在屏幕坐标中返回一个矩形 - 相对于屏幕/监视器的坐标。 GetClientRect() 返回一个相对于自身的矩形。

【讨论】:

【参考方案3】:

GetClientRect 获取窗口客户区的坐标。具体来说,这是 inside 窗口镶边和 排除 标题等区域。the MSDN page 上的一个 cmets 总结得很好:

我会说这个函数返回我可以渲染到的区域的大小。

GetWindowsRect 获取整个窗口的坐标。这包括标题、状态栏等。但是根据the MSDN page上的评论

Vista 下未与 WINVER=6 链接的应用将在此处收到一组误导性值,这些值不考虑 Vista Aero 应用于窗口的“玻璃”像素的额外填充。

因此,除非已针对 Windows 7 修复此问题,否则请仔细检查您获得的结果并确保您拥有正确的 WINVER 值。

【讨论】:

【参考方案4】:

来自 MSDN:GetWindowRect 检索指定窗口的边界矩形的尺寸。尺寸以相对于屏幕左上角的屏幕坐标给出。

GetClientRect 检索窗口客户区的坐标。客户坐标指定客户区的左上角和右下角。因为客户坐标是相对于窗口客户区的左上角的,所以左上角的坐标是(0,0)。

更多:客户端矩形不包括标题栏、边框、滚动条、状态栏...

【讨论】:

感谢关于从 GetClientRect() 返回的相对坐标的观点。 关于滚动条的重要说明

以上是关于WinApi中的GetClientRect和GetWindowRect有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

WinAPI 中的 GetLongPathName 和 GetFullPathName 有啥区别?

WinAPI 中的 sz 和 pwsz 前缀

自定义函数中的 WINAPI BeginPaint 和 TextOut 多次调用

如何使用 WinAPI 检测控制台中的符号?

winapi中的多行按钮

MFC-GetClientRect获取窗口客户区的坐标