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 有啥区别?