【问题标题】:What is the difference between GetClientRect and GetWindowRect in WinApi?WinApi中的GetClientRect和GetWindowRect有什么区别?
【发布时间】:2011-11-25 12:55:58
【问题描述】:

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

【问题讨论】:

    标签: c++ windows winapi gdi


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        GetWindowsRect 获取整个窗口的坐标。这包括标题、状态栏等。但是根据the MSDN page上的评论

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 感谢关于从 GetClientRect() 返回的相对坐标的观点。
          • 关于滚动条的重要说明
          猜你喜欢
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          • 2012-03-14
          • 2012-02-06
          • 2011-02-25
          相关资源
          最近更新 更多