在UpdateLayeredWindow调用之后,分层窗口仍然接收WM_PAINT消息

时间:2009-06-08 15:27:00

标签: windows user-interface layered-windows

我的应用程序中有几个分层窗口,使用UpdateLayeredWindow()来处理它们的可视化表示。根据{{​​3}},“使用UpdateLayeredWindow()时,应用程序无需响应WM_PAINT或其他绘画消息。”他们与非分层窗口共享一些相同的消息处理程序,所以我想如果目标是分层窗口,我会从WM_PAINT处理中提前返回。

当然,这引起了一个主要问题:如果其中一个分层窗口 获得了WM_PAINT消息,那么输入队列最终将充满无休止的{{1消息。这个最终结果是有道理的,因为窗口永远不会被验证,所以它会一直认为它需要绘制(我不应该在没有验证或WM_PAINT等的情况下从处理程序返回),但是有意义的是它首先收到消息的原因,因为它对使用BeginPaint()的窗口没有影响。

它甚至不会可靠地发生 - 只是偶尔发生,而不是每次窗口的像素都需要重绘。当分层窗口收到UpdateLayeredWindow()消息时,恢复到DefWindowProc()恢复了理智,但我觉得有些事情正在发生,我不明白。考虑到这个问题很少表现出来,我担心这可能只是隐藏了一个更微妙的问题。使用WM_PAINT的窗口的预期行为是否仍会偶尔显示UpdateLayeredWindow()消息?只要我正确处理它,这有关系吗?

如果需要,附加信息:窗口在创建后立即调用WM_PAINT,然后它自己保留(它不会再次调用它,因为它不会更改)。使用C ++和win32 API,没有MFC。

1 个答案:

答案 0 :(得分:1)

我以前遇到过类似的问题,虽然现在我的记忆可能有点生疏了。

首先,保留DefWindowProc。当文档说你不必回复时,我会认为这意味着完全忽略这个消息,而不是阻止默认处理。

我亲身经历过两个不同的原因。一个是实际发送WM_PAINT消息的窗口(邪恶!小心!)。另一个(IIRC)来自某些RedrawWindow电话。在这两种情况下,我都将问题归结为编写得不好的代码,超出了我的控制范围,并且从未将任何情况简单地传递给DefWindowProc。

希望你有同样的经历!

祝你好运。我发现分层窗口的文档很少,并且充满了有趣的警告和陷阱,但是一旦你解决了所有的问题,我就会非常讨人喜欢。