具有重叠兄弟和WS_EX_TRANSPARENT的错误绘图

时间:2013-01-16 19:39:06

标签: winapi drawing

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

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

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

正在使用WS_EX_TRANSPARENT,因为第一个子窗口被用作第二个子窗口的叠加层,我希望避免叠加层阻止鼠标点击。

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

1 个答案:

答案 0 :(得分:0)

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

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

无论我猜测如何,你的案例中应该有效的修复方法是在W2无效时使W1无效。或者只是在W1完全重叠时使W1无效。希望有效,祝你好运。