【问题标题】:Clipping window rendering to a region裁剪窗口渲染到一个区域
【发布时间】:2012-03-08 17:24:09
【问题描述】:

我有一个 100x100 的窗口,但我只想绘制 50x100 并在不使用 WS_EX_LAYERED 的情况下保持右侧透明。启用自动隐藏后,Windows 任务栏似乎会执行此操作。根据 GetWindowRect,任务栏高 40 像素,但只有 2 像素可见。怎么可能有一个比屏幕上显示的窗口更大的窗口而不使它成为一个分层窗口?

【问题讨论】:

    标签: winapi


    【解决方案1】:

    SetWindowRgn 使您的窗口小于其GetWindowRect

    【讨论】:

    • Windows任务栏好像没有使用SetWindowRgn,还有其他方法吗?
    • 使用这个工具:rohitab.com/apimonitor,看起来Windows任务栏在自动隐藏时使用了开始按钮上的SetWindowRgn,而不是任务栏。
    【解决方案2】:

    如果您仔细观察,您会发现任务栏有 40 像素高,但其中 38 个像素不在屏幕上。

    【讨论】:

    • 这就是我要问的问题,在多显示器设置中,那些额外的 38px 在第二个屏幕上是不可见的。
    • 在这种情况下,有一个窗口区域。试试看:调用GetWindowRgn 并看到它返回一个矩形,该矩形将第二个监视器剪掉。
    • 在我的窗口上调用 SetWindowRgn 会强制禁用 DWMWA_NCRENDERING_ENABLED,并且在删除该区域之前我无法重新启用它。有办法解决吗?
    • 没有。如果您应用一个区域,那么您是在说“我想要非默认绘图”并且窗口管理器说“好吧,在这种情况下,我最好让你去做,不要试图通过在你的地方绘制标题和东西来猜测你不想要他们。”任务栏代码没有做区域的事情来获得任何特殊效果。这只是避免溢出到另一台显示器的技巧。
    猜你喜欢
    • 2014-09-14
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多