2009-11-23 33 views
0

我知道WM_PAINT告訴一個窗口,它需要完全重新繪製自己,但顯然這並不是在部分覆蓋時發送的消息,然後窗口前面的窗口不再出現,並且它需要重新繪製髒部分。有沒有人知道在這種情況下發送了什麼消息?發送Windows消息以重新繪製部分遮擋的窗口?

編輯:發現問題:

問題涉及到德爾福控制我寫的是一個Delphi窗體上嵌入SDL呈現表面。 SDL有一個API在另一個窗口的HWND上構建渲染器,並將其標記爲「外部窗口」。

SDL通常在內部處理WM_PAINT,所以我最終不得不向SDL的WindowProc添加一些代碼,以便將消息轉發到外部WindowProc,如果它是外部窗口的話。這有時是有效的,但事實證明,從窗口的數據結構中剝離了外部窗口標誌是一個小問題,所以它吞噬了消息而不是將它傳遞給我的應用程序。一旦我解決了這個問題,我就開始收到WM_PAINT消息。

+0

所有5個答案都是正確的:WM_PAINT是當您的客戶區域的部分或全部需要重新繪製時發送的*消息。在較新版本的Windows上,它並不像以前那樣頻繁發送,因爲Windows爲了實現分層窗口和玻璃窗口視覺效果而更積極地緩存桌面 - Windows從內部位圖繪製不發送任何類型的消息在那種情況下。 – 2009-11-23 08:52:01

回答

1

爲什麼你說這顯然不是?應調用WM_PAINT進行部分重繪(更新後的矩形由BeginPaintGetUpdateRect返回)。如果它看起來沒有被調用,那麼應用中其他地方可能存在一個阻止它的錯誤。你看到的是什麼讓你相信它不起作用?

+0

因爲我有一個Delphi組件,它有一個處理WM_PAINT的方法,但它沒有被調用來進行部分重繪。那麼我只能得出結論,沒有WM_PAINT正在發送。要麼是這個,要麼是沿線的某個地方非常錯誤,因爲我*對於全面塗料來說很好。 – 2009-11-23 04:23:15

+0

你在做什麼來調用部分重繪(以及什麼操作系統?) – Toji 2009-11-23 05:57:01

+0

我只在XP上看到這個,因爲Vista在將每張表單顯示在其自己的緩衝區中之前,將它們繪製到屏幕上。我正在做的是打開另一個窗口,它顯示在我正在使用的窗體的前面,然後將窗體重新放回到前臺。一切都得到了正確的重新繪製,除了一個組件,它從來沒有得到一個WM_PAINT消息,我試圖找出發生了什麼,爲什麼。 – 2009-11-23 14:06:30

0

我很確定Win32 API使用WM_PAINT即使對於部分重繪。從MSDN

WM_PAINT消息被髮送時的系統或另一應用程序對油漆一個應用程序的窗口的一部分的請求。 [我的斜體]。

這種聯繫有充分的細節上WM_PAINT,但如果如你所說,WM_PAINT消息是正在爲部分重繪發送時,Spy++是你需要找到肯定的工具。

1

WM_PAINT被髮送以指示某些部分(包括整個窗戶需要重新粉刷。

調用GetUpdateRect()得到一個矩形,該矩形限定了要更新的區域。該信息也包含在傳遞給BeginPaint()的PAINTSTRUCT(作爲rcPaint字段)中。

相關問題