[英]C++ - Dialog box question
這是與我上一個問題有關的更具體的問題。
我有一個使用計時器的應用程序。 代碼是通過我的WM_TIMER
處理程序通過一些自定義消息處理程序(稱為DlgProc
)調用DialogBoxParam(...)
的方式編寫的。
可以通過以下方式完成此操作:
case WM_TIMER:{//例程,顯示一個特殊的消息框DisplayMessageBox(...); 返回0; }
現在,如果我讓DlgProc
處理此類消息(請參見代碼),這將導致大量對話框(每個WM_TIMER
調用一個)。
switch (msg)
{
case WM_INITDIALOG:
// (...)
return TRUE;
case WM_COMMAND:
// (...)
return TRUE;
return FALSE;
}
但是,如果我在DlgProc
添加了一個虛擬WM_PAINT
處理程序( return TRUE;
),這將導致顯示的DialogBox和100%的CPU負載正好(這是因為我收到了大量的WM_PAINT
消息)。
如果我希望我的應用程序准確顯示一個對話框並且沒有WM_PAINT處理的CPU負載,該怎么辦? (我的意思是,有類似的行為來繪制唯一的對話框並完全暫停父窗口) 。
同樣,如果有人解釋在這種情況下實際發生的情況以及為什么我會在對話框中收到成千上萬的WM_PAINT
消息,以及為什么它們的處理(帶有return TRUE
)會導致阻止其他對話框的創建,那也很好。
謝謝。
1)如果只想顯示一個對話框,則應在捕獲第一個WM_TIMER信號后禁用計時器。 您可以使用KillTimer()做到這一點。
2)Windows希望保持GUI為最新。 每當屏幕上的區域應更新時,使用InvalidateRect或InvalidateRgn都會使該區域無效。 現在,對於每個“無效”屏幕部分,都會調用WM_PAINT以便再次使“有效”。
如果您不執行(或僅執行部分操作),則Windows將再次調用WM_PAINT。 一種方法是調用ValidateRect 。 在許多情況下,使用BeginPaint()和EndPaint()來完成這項工作。
3)也許最重要:您不應該只返回FALSE! 對於Windows,請嘗試DefWindowProc();對於對話框,請嘗試DefDlgProc()。 他們還將適當地照顧WM_PAINT。
不是您注冊了WM_PAINT,而是一定要引起它(即使您沒有添加WM_PAINT:處理程序),也要查找重新繪制函數(例如InvalidateRect())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.