WinApi中的GetClientRect和GetWindowRect有什么区别?

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

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

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

InvalidateRect在客户端坐标中接收一个矩形。 如果您想使整个客户区域无效,则将NULL传递给InvalidateRect 。 你可以传递GetClientRect返回的rect,但是传递NULL更简单,更清晰。

GetClientRect获取窗口客户区的坐标。 具体来说,这是窗口区域的区域,并排除标题等MSDN页面上的一个评论总结得很好:

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

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

Vista下没有与WINVER = 6链接的应用程序将在这里收到一组令人误解的值,这些值并不包含“玻璃”像素的额外填充。Vista Aero应用于窗口。

所以,除非这个问题已经被修复,否则请检查你得到的结果,并确保你有正确的WINVER值。

一个非常简单的解释就是GetWindowRect()给你提供了包含窗口边框的矩形。 GetClientRect()为您提供排除边界的矩形 – 分配给窗口特定图形的区域。

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

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

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

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