2012-02-25 100 views
0

我製作了一個自定義非客戶區域的程序。除了處理WM_NCPAINT之外,我還將WM_NCCALCSIZE中的客戶區大小設置爲零,然後通過處理WM_NCHITTEST來模擬非客戶區。所有繪製到窗口的內容都是在WM_PAINT中處理的。當我啓動程序並且程序需要重新繪製時,WM_PAINT工作正常。但是,一旦我通過調用ShowWindow(hwnd,SW_MINIMIZE)來最小化程序,然後通過在任務欄中單擊它來還原程序,WM_PAINT不再有效。我檢查了WM_PAINT中的每個函數調用,它們都返回成功,但窗口只顯示爲黑色。任何人有什麼想法爲什麼?WM_PAINT在最小化和恢復窗口後停止工作

下面是我的WM_PAINT處理程序的代碼:

http://pastebin.com/MXmWzb4M

下面是輸出到控制檯窗口:

BeginPaint的成功

hdcBuffer有效

MainWindow- > hbmBuffer有效

hdcMem有效

所以,看到我在WM_PAINT處理每一個函數調用返回成功,爲何顯示爲黑色的我的整個窗口?

+0

你不是應該在這種情況下,使用'WM_NCPAINT'? – pezcode 2012-02-25 14:44:04

+0

@pezcode它並不重要,因爲這兩個處理程序基本上都是一樣的。 – Gogeta70 2012-02-25 14:56:56

+0

我已經解決了這個問題,我會在6-7小時內添加答案,當stackoverflow將讓我> _ < – Gogeta70 2012-02-25 15:53:08

回答

0

原來,問題出在處理WM_NCCALCSIZE消息以刪除非客戶區域。這裏的替代方案,我用:

 DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE); 
     dwStyle &= ~WS_OVERLAPPEDWINDOW; 
     SetWindowLong(hwnd, GWL_STYLE, dwStyle); 
+1

您將希望使用'GetWindowLongPtr'和'SetWindowLongPtr'以實現未來的64位兼容性。 – 2012-02-26 07:39:45

+0

非Ptr版本適用於樣式(GWL_ * STYLE),但可能很容易出現C&P錯誤,因此切換到SetWindowLongPtr是個不錯的建議... – Anders 2012-02-26 07:56:57

+0

啊我明白了。我會記住這一點以備將來參考,謝謝指出。^_ ^ – Gogeta70 2012-02-26 12:22:26

相關問題