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

Abz*_*zac 25 c++ windows winapi gdi

我应该在InvalidateRect中使用以下内容来刷新我的窗口?为什么?

Dav*_*nan 44

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

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

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


Chr*_*isF 11

GetClientRect获取窗口客户区的坐标.具体而言,这是区域的窗口镶边和排除头等等.一个在评论中MSDN页面概括起来相当不错:

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

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

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

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


Jör*_*son 10

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

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


Mar*_*rco 6

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

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

更多:client rect不包括标题栏,边框,滚动条,状态栏......

  • 关于滚动条的重要说明 (2认同)