2010-12-08 10 views
6

私は1つのメインウィンドウとモードレスダイアログで簡単な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を(使用せず)、モードレスウィンドウはまだクリックなどのイベントやマウスで派遣いくつかの他のイベントを取得します。

なぜですか?メインループがメッセージをディスパッチしていない場合、どのようにしてこれらのメッセージを得ることができますか?

私はそれが内部的にどのように動作するかを知りたいだけです。

答えて

6

IsDialogMessageはいくつかのメッセージをフィルタリングしますが、ほとんどのメッセージはメッセージループのTranslateMessage/DispatchMessage部分に当たって正常にディスパッチされます。

IsDialogMessageがいくつかのメッセージを処理しなければならない理由は、メッセージが間違ったウィンドウに配信されるということです。

通常、キーの押下メッセージは、フォーカスのあるコントロールに配信されます。ただし、タブのキーストロークは、ダイアログの次のコントロールにフォーカスを移動するためのものです。 タブコントロールを処理するすべてのコントロールを作成するのではなく、IsDialogMessageは実際に現在フォーカスが設定されているコントロールに配信される前にタブキーストロークをキャッチし、ダイアログロジックがTabロジックを処理するようにします。

他のほとんどのメッセージ(マウスオーバーやペインティングなど)は、ダイアログボックスのウィンドウprocに配信されるため、通常の方法で処理されます。実際にはコントロールに送信される予定のメッセージのサブセットですが、ダイアログボックスで処理する必要があり、IsDialogMessageがフィルタ処理して処理します。

0

IsDialogMessageを使用しないと、Tabキーを押したときにフォーカスを変更するようなダイアログ機能が動作しません。 IsDialogMessageは、これらのダイアログ固有の機能を実装しています。 TRUEを返すと、現在のメッセージはすでに処理されており、TranslateMessageとDispatchMessageを呼び出す必要はありません。

4

モーダルウィンドウが

モーダルダイアログ(DialogBox*)は、独自のメッセージループ(そして、仕事を作成...あなたのHWNDがg_hToolbarと呼ばれているという事実は、これがモーダルダイアログではないことを私に伝え、親ウィンドウを無効にします(CreateDialog*ウィンドウマネージャ(IsDialogMessageなし)、IsDialogMessageが実行するメッセージダイアログマネージャ(TABとデフォルトのボタンフォーカスの処理など)からすべてのメッセージが表示されます。

ダイアログボックス以外のウィンドウでIsDialogMessageを使用する方法については、thisのブログ記事を参照してください。ダイアログマネージャの概要と独自の書き方については、this post seriesを参照してください。

+0

あなたはそうです!モーダルではなくモードレスウィンドウについて話していました。レイモンド・チェンの素敵な記事、ありがとう! –