2010-05-21 78 views
1

這是一個更具體的問題,與我以前的問題有關。C++ - 對話框問題

我有一個使用計時器的應用程序。代碼以我的WM_TIMER處理程序調用DialogBoxParam(...)以及一些自定義消息處理程序(我們稱之爲DlgProc)的方式編寫。

這在一定程度上做了以下的方法:

情況下WM_TIMER: {// 常規,顯示一個特殊的消息框 DisplayMessageBox(...); return 0; }

現在,如果我做DlgProc處理這樣的消息(見代碼),這將導致噸的對話框(每WM_TIMER調用一個)。

switch (msg) 
    { 
    case WM_INITDIALOG: 
     // (...) 
     return TRUE; 
    case WM_COMMAND: 
     // (...) 
     return TRUE; 
    return FALSE; 
    } 

但是,如果我添加一個虛擬WM_PAINT處理器(return TRUE;)我DlgProc,這導致所示對話框和100%的CPU負載(那是因爲我收到噸WM_PAINT消息)只有一個。

問:

有什麼可以在這裏完成,如果我想我的應用程序,以顯示只有一個對話框,並有WM_PAINT處理無CPU負載? (我的意思是,有類似的行爲繪製獨特的對話框,並完全暫停父窗口)

此外,如果有人解釋究竟是什麼在這種情況下發生這將是偉大的,爲什麼我收到WM_PAINT消息gazillions到我的對話框,爲什麼他們的處理(return TRUE)導致防止其他對話框創建。

謝謝。

+0

你叫DefDlgProc某處您的代碼 – 2010-05-21 13:13:44

回答

3

1)如果您只想顯示一個對話框,應該在捕獲到第一個WM_TIMER信號後禁用定時器。你可以使用KillTimer()來做到這一點。

2)Windows想讓GUI保持最新狀態。只要屏幕上的某個區域應該更新,就會使用InvalidateRect或InvalidateRgn無效。現在,對於每個「無效」屏幕部分,調用WM_PAINT以便再次生成「有效」。

如果你不這樣做(或只是其中的一部分),Windows將再次調用WM_PAINT ...並再次調用WM_PAINT。一種方法是致電ValidateRect。在很多情況下,BeginPaint()和EndPaint()用於完成這項工作。

3)也許最重要的是:你不應該只是返回FALSE!嘗試Windows的DefWindowProc()和對話框的DefDlgProc()。他們也將適當地照顧WM_PAINT。

+0

切勿從對話框過程中調用DefDlgProc。 DefDlgProc是調用DialogProc的對話框WINDOW proc。 – 2010-05-22 15:28:10

0

這並不是說你WM_PAINT註冊,有事必須使它(即使你不添加WM_PAINT:處理),尋找RE /繪製函數(如InvalidateRect())