【问题标题】:Incorrect drawing with overlapping siblings and WM_EX_TRANSPARENT具有重叠同级和 WS_EX_TRANSPARENT 的不正确绘图
【发布时间】:2013-01-16 19:39:06
【问题描述】:

我有一个问题,当一个窗口在另一个具有 WS_EX_TRANSPARENT 样式的窗口下方更新时,重叠的子窗口没有正确绘制。

父窗口有两个子窗口,W1 和 W2,它们与 W1 在 z 顺序中高于 W2 重叠。 W1 具有扩展样式 WS_EX_TRANSPARENT。问题是,当 W2 在其客户区域中绘制时(我正在通过使 W2 无效来测试),W2 完全在 W1 的重叠部分上绘制。如果重绘父级,则两个重叠的子级都以正确的顺序绘制。

当在 W2 上设置 WS_CLIPSIBLINGS 并且从 W1 中删除 WS_EX_TRANSPARENT 时,子窗口被正确绘制。如果 W2 的客户区在这种情况下失效,它会绘制但不会覆盖被 W1 遮挡的部分。

正在使用 WS_EX_TRANSPARENT,因为第一个子窗口被用作第二个子窗口的覆盖,我想避免鼠标点击被覆盖阻止。

有没有办法使用 WS_EX_TRANSPARENT 样式正确绘制重叠窗口,或者我可以使用某种解决方法获得相同的行为?

【问题讨论】:

    标签: winapi drawing


    【解决方案1】:

    WS_EX_TRANSPARENT 不稳定。 KB article 有一个解释,“我们实际上不支持透明窗口”。但是没有解释操作,SDK也没有,Raymond Chen也没有。我已经被咬过太多次,所以不要再使用它了。

    但我认为规则是,当上层窗口需要绘制以确保设置背景像素时,它会负责让覆盖的窗口首先绘制。因此,使 W1 无效也会使 W2 无效,然后正常的 Z 顺序绘制会处理这些事情。忽略不可避免的闪烁问题。但不是相反,使覆盖的窗口无效不会强制重新绘制上面的窗口。你的情况有点挂机。

    不管我的猜测如何,在您的情况下应该有效的解决方法是在您使 W2 无效时也使 W1 无效。或者当 W1 与 W2 完全重叠时使 W1 无效。希望能成功,祝你好运。

    【讨论】:

    • 感谢您的想法,我得出了相同的结论,但我决定在透明窗口中添加一个计时器并让它自己失效。当 W2 重绘时让 W1 重绘需要我重写 W2 的窗口过程来拦截 WM_PAINT 消息,因为它是第三方控件。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多