0

我有一个问题,当一个窗口在另一个具有 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 样式正确绘制重叠窗口,或者我可以使用某种解决方法获得相同的行为?

4

1 回答 1

0

WS_EX_TRANSPARENT 不稳定。知识库文章有一个逃避,“我们实际上并不支持透明窗口”。但是没有解释操作,SDK也没有,Raymond Chen也没有。我被咬过太多次,所以不要再使用它了。

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

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

于 2013-01-16T21:37:55.253 回答