2009-06-08 231 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。

希望你會有相同的經歷!

祝你好運。我發現分層的窗口記錄不完整,充滿了有趣的警告和陷阱,但是一旦你得到了所有的結果,就會非常愉快。

相關問題