2010-12-08 59 views
6

我正在用一個主窗口和一個無模式對話框創建一個簡單的win32程序。關於WIN32中IsDialogMessage()的問題

我知道使用IsDialogMessage()程序將調度消息到非模態窗口(如鍵盤事件)。

// step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    if(!IsDialogMessage(g_hToolbar, &Msg)) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 
} 

,但沒有使用的IsDialogMessage(),該模式窗口,仍然可以得到像click事件,並通過鼠標派出一些其他事件。

爲什麼?如果主循環沒有向它發送消息,這個無模式如何獲得這些消息?

我只想知道它是如何在內部工作的。

回答

6

IsDialogMessage過濾掉了一些消息,但允許大多數消息打到消息循環的TranslateMessage/DispatchMessage部分並正常分派。

IsDialogMessage必須處理某些消息的原因是消息將被傳遞到錯誤的窗口。

考慮 - 通常 - 按鍵消息通過焦點傳遞給控件。但是,製表符按鍵意味着將焦點移至對話框中的下一個控件。 與其讓每個控件都必須處理製表符,IsDialogMessage都會在將製表符按鍵傳遞到實際的當前集中控件之前捕獲它們,並確保對話框代碼處理製表符邏輯。

大多數其他消息 - 鼠標懸停和繪畫等 - 將被傳遞到對話框的窗口proc - 所有按正常方式處理。它實際上只是註定要發送到控件的消息子集,但需要通過對話框進行處理,即IsDialogMessage過濾掉並處理。

0

如果沒有IsDialogMessage,某些對話框功能(如按Tab鍵時更改焦點)不起作用。 IsDialogMessage實現了這些對話特定的功能。如果它返回TRUE,那麼當前消息已經被處理,並且不需要調用TranslateMessage和DispatchMessage。

4

模態窗口將關閉它的父窗口,事實上,你的HWND被稱爲g_hToolbar告訴我,這是不是一個模式對話框...

模式對話框(DialogBox*)創建自己的消息循環(與工作像MessageBox等),你必須談論無模式對話框(CreateDialog*)你將從窗口管理器所有消息沒有IsDialogMessage,IsDialogMessage執行對話框管理器像處理選項卡和默認按鈕焦點任務。

請參閱this有關在非對話窗口上使用IsDialogMessage的信息博客文章。請參閱this post series以獲得有關對話管理器以及如何編寫自己的詳細概述。

+0

你說得對!我正在談論無模式的窗口,而不是模態。 Raymond Chen的好文章,謝謝! – 2010-12-09 07:37:53