【发布时间】:2011-11-25 12:55:58
【问题描述】:
我应该在 InvalidateRect 中使用哪些来刷新我的窗口?为什么?
【问题讨论】:
我应该在 InvalidateRect 中使用哪些来刷新我的窗口?为什么?
【问题讨论】:
窗口矩形包括非客户区,即窗口边框、标题栏等。客户端矩形不包括。
GetWindowRect 在屏幕坐标中返回一个矩形,而GetClientRect 在客户端坐标中返回一个矩形。
InvalidateRect 在客户端坐标中接收到一个矩形。如果要使整个客户区无效,请将NULL 传递给InvalidateRect。你可以传入GetClientRect返回的rect,但传递NULL要简单得多。
【讨论】:
一个非常简单的解释是GetWindowRect() 为您提供了包含窗口边框的矩形。 GetClientRect() 为您提供不包括边框的矩形 - 分配给窗口特定绘图的区域。
请注意GetWindowRect() 在屏幕坐标中返回一个矩形 - 相对于屏幕/监视器的坐标。 GetClientRect() 返回一个相对于自身的矩形。
【讨论】:
GetClientRect 获取窗口客户区的坐标。具体来说,这是 inside 窗口镶边和 排除 标题等区域。the MSDN page 上的一个 cmets 总结得很好:
我会说这个函数返回我可以渲染到的区域的大小。
GetWindowsRect 获取整个窗口的坐标。这包括标题、状态栏等。但是根据the MSDN page上的评论
Vista 下未与 WINVER=6 链接的应用将在此处收到一组误导性值,这些值不考虑 Vista Aero 应用于窗口的“玻璃”像素的额外填充。
因此,除非已针对 Windows 7 修复此问题,否则请仔细检查您获得的结果并确保您拥有正确的 WINVER 值。
【讨论】:
来自 MSDN:
GetWindowRect
检索指定窗口的边界矩形的尺寸。尺寸以相对于屏幕左上角的屏幕坐标给出。
GetClientRect
检索窗口客户区的坐标。客户坐标指定客户区的左上角和右下角。因为客户坐标是相对于窗口客户区的左上角的,所以左上角的坐标是(0,0)。
更多:客户端矩形不包括标题栏、边框、滚动条、状态栏...
【讨论】: