Programming Field - プログラミング Tips

IsDialogMessageとTabキーによるフォーカス移動など

今回のテーマはIsDialogMessageについてです。

IsDialogMessage(リンク先はMSDN日本語)は、文字通り「ダイアログボックスのメッセージかどうか」を判定する関数で、ダイアログのメッセージである場合は、その処理も行ってくれる関数です。主にモードレスダイアログボックスを表示した際にダイアログとしての動作を失わせないために用いますが、リンク先のドキュメントにも書かれている通り、「ダイアログボックスと同じキーボード選択を実現するために、コントロールを含む任意のウィンドウに対して使うこともできます」。すなわち、普通のウィンドウでTabキーによるフォーカス移動や「ESCキー」=「キャンセルボタンのクリック」の処理、「エディットボックスでのEnterキー」=「OKボタンのクリック」の処理を実装したい場合、メッセージループ内でIsDialogMessage関数を呼び出すだけでOKです。(MFCの場合はPreTranslateMessageメソッドで処理します。)

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!IsDialogMessage(hWndMain, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

一部のホームページではカスタムダイアログにしなければいけない(WNDCLASSのcbWndExtraにDLGWINDOWEXTRAを設定し、ウィンドウプロシージャでDefDlgProcを呼び出す)と書かれている場合もありますが、ウィンドウ上でTabキーによるフォーカス移動を行いたい場合は、WS_TABSTOPスタイルと「IsDialogMessage関数」のみで十分です(Windows 95で確認済み)。

おまけ: リッチエディットコントロールでTabキーによるフォーカス移動を有効にする場合は、リッチエディットコントロールをサブクラス化し、WM_GETDLGCODEメッセージを処理してDLC_WANTALLKEYSやDLGC_WANTTABを返さないようにすればOKです。

最終更新日: 2009/02/27