2009-06-08 235 views
0

我的应用中有几个分层窗口,它们使用UpdateLayeredWindow()来处理它们的视觉表示。根据MSDN article on layered windows,“当使用UpdateLayeredWindow()时,应用程序不需要响应WM_PAINT或其他绘画消息。”他们与非分层窗口共享一些相同的消息处理程序,所以我认为如果目标是分层窗口,我会早于WM_PAINT处理。在UpdateLayeredWindow调用后,分层窗口仍然接收WM_PAINT消息

当然,这引起了一个重大问题:如果分层窗口的人做得到WM_PAINT消息,输入队列最终会与WM_PAINT消息的无休止流淹没。这个最终结果是有道理的,因为窗口永远不会被验证,所以它会一直认为它需要绘制(我不应该从处理程序返回而没有验证或者等等),但是什么没有是有道理的,因为它首先收到了消息,因为它对使用UpdateLayeredWindow()的窗口没有影响。

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

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

回答

1

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

首先,保持DefWindowProc。当文档说你不必回复时,我会认为完全忽略该信息,而不是防止默认处理。

我个人从两个不同的原因中体会到了这一点。其中一个是实际发送WM_PAINT消息的窗口(邪恶!小心!)。另一个(IIRC)来自某些RedrawWindow调用。在这两种情况下,我都把问题归咎于编写不好的代码,而不是我的控制,并且从来没有将任何情况简单地传递给DefWindowProc。

希望你会有相同的经历!

祝你好运。我发现分层的窗口记录不完整,充满了有趣的警告和陷阱,但是一旦你得到了所有的结果,就会非常愉快。

相关问题