WinApi中GetClientRect和GetWindowRect有什么区别?

37

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

4个回答

55

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

GetWindowRect 返回屏幕坐标系下的一个矩形,而 GetClientRect 则返回客户端坐标系下的一个矩形。

InvalidateRect 接收一个客户端坐标系下的矩形参数。如果您想使整个客户端区域无效,则将 NULL 传递给 InvalidateRect。您可以传递由 GetClientRect 返回的矩形,但是使用 NULL 更加简单和清晰。


17

一个非常简单的解释是,GetWindowRect()会给你包含窗口边界的矩形区域。而GetClientRect()则给你窗口除边框外的矩形区域 - 专门用于绘制窗口内容的区域。

请注意,GetWindowRect()返回的是屏幕坐标系下的矩形区域 - 相对于屏幕/显示器的坐标系。而GetClientRect()返回的矩形区域则相对于窗口本身。


12

GetClientRect 函数获取窗口客户区的坐标。具体来说,这是窗口装饰的内部区域,不包括标题栏等内容。在MSDN页面上的一条评论总结得非常好:

我认为此函数返回了我可以渲染的区域大小。

GetWindowsRect 函数获取整个窗口的坐标。包括标题栏、状态栏等等。但是根据MSDN页面上的一条评论:

在未链接WINVER=6的Vista下运行的应用程序将会收到一个错误的值,该值未考虑Vista Aero对窗口应用的额外玻璃像素填充。

因此,除非在Windows 7上已经修复了此问题,请双重检查您获得的结果,并确保使用正确的WINVER值。


8

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

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

更多信息: 客户区域不包括标题栏、边框、滚动条、状态栏...


感谢您提供的关于GetClientRect()返回相对坐标的提示。 - rpattabi
2
关于滚动条的重要说明 - blackbada_cpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接