在WinApi中GetClientRect和GetWindowRect的区别是什么?

What is the difference between GetClientRect and GetWindowRect in WinApi?

本文关键字:区别 是什么 GetWindowRect WinApi GetClientRect      更新时间:2023-10-16

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

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

GetWindowRect返回屏幕坐标的rect,而GetClientRect返回客户端坐标的rect。

InvalidateRect接收到客户端坐标的rect。如果您想使整个客户端区域无效,那么将NULL传递给InvalidateRect。您可以传入GetClientRect返回的rect,但是传入NULL要简单和清楚得多。

一个非常简单的解释是GetWindowRect()给出了包含窗口边框的矩形。GetClientRect()给出了排除边框的矩形——分配给窗口特定绘图的区域。

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

GetClientRect获取窗口客户区的坐标。具体来说,这是窗口铬内的区域,不包括头等。MSDN页面上的一条评论总结得很好:

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

GetWindowsRect获取整个窗口的坐标。这个包括标题,状态栏等。但是根据MSDN页面

上的评论

没有与WINVER=6链接的Vista下的应用程序将在这里收到一组误导性的值,这没有考虑到Vista Aero应用于窗口的额外"玻璃"像素。

所以,除非这个问题在Windows 7中得到了解决,否则请仔细检查你得到的结果,并确保你有正确的WINVER值。

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

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

More: client rect不包括标题栏,边框,滚动条,状态栏…