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

时间:2011-09-26 20:41:27

标签: c++ windows winapi gdi

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

4 个答案:

答案 0 :(得分:44)

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

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

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

答案 1 :(得分:11)

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

  

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

GetWindowsRect获取整个窗口的坐标。此包含标题,状态栏等。但根据对the MSDN page的评论

  

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

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

答案 2 :(得分:10)

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

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

答案 3 :(得分:6)

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

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

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