【问题标题】:Determine if a rect is visible inside window确定矩形是否在窗口内可见
【发布时间】:2010-11-01 18:19:03
【问题描述】:

我想确定窗口内的矩形是否完全可见。

我找到了 RectVisible,但是该函数确定矩形的任何部分是否可见,我想知道整个矩形是否可见。

这个有什么功能吗?

【问题讨论】:

    标签: winapi window visible rect


    【解决方案1】:

    首先使用GetRandomRgn将系统剪辑区域(窗口的可见区域)放入一个区域。阅读有关“系统区域”here 的更多信息。然后,偏移该区域,因为它位于屏幕坐标中(我链接的文章有一个示例)。之后,使用CreateRectRgn 从矩形创建一个区域,并将“矩形区域”的部分与不属于“系统区域”的部分组合起来:即调用CombineRgn,将矩形区域作为第一个区域传递,系统区域为第二个区域,RGN_DIFFfnCombineMode。如果结果是NULLREGION,那么您的矩形是完全可见的——它没有被任何窗口(顶层或非顶层)完全或部分覆盖,或者它不是完全或部分不在屏幕上。

    总而言之,您有可能以错误的方式解决问题。如果您已经说出了您一直在努力实现的目标,那么某人可能会建议一种更简单的方法。

    【讨论】:

    • 在 Windows 7 上,“系统区域”始终与矩形区域完全相同,即使窗口已被其他窗口关闭或屏幕外。
    【解决方案2】:

    在矩形的每个角上使用PtVisible

    PtVisible 函数确定 指定点是否在范围内 设备的裁剪区域 上下文。

    【讨论】:

    • 这在大多数情况下都会起作用,但你不能确定矩形内部没有覆盖什么东西。一个比矩形更小的窗口可以放在我需要检查的窗口的顶部。
    【解决方案3】:

    你能用窗口和矩形的坐标做一个简单的比较吗?

    检查矩形的左纵坐标是否在窗口左边框的右侧;右纵坐标位于窗口右边框的左侧;顶部和底部类似吗?

    唯一的问题可能是如果您同时使用逻辑坐标和物理坐标,在这种情况下您将需要执行转换。

    【讨论】:

      【解决方案4】:

      所有处理剪切矩形和点可见性的功能都因 Windows Vista 的新桌面合成功能而中断。这些功能可以在 Windows XP 和更早版本以及关闭 Aero/Desktop Composition 的 Windows 7 上正常工作,但除此之外,它们将始终声称整个窗口都是可见的。

      【讨论】:

        猜你喜欢
        • 2011-02-09
        • 2013-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多