Tips of VC++ > ダイアログ > モーダルダイアログボックスを作る
★ 前へ戻る ★ 次へ進む


モーダルダイアログボックスを作る

モーダルダイアログボックスと言うのは、 フォーカスを持っているときは、 他のウィンドウにフォーカスを与える事ができないウィンドウです。 バージョン情報ダイアログなどがそれです。

メッセージループを作らなくていいし、 ダイアログの外観もリソースとして使うので、かなり楽です。

INT_PTR DialogBox(
  HINSTANCE hInstance,  // モジュールのハンドル
  LPCTSTR lpTemplate,   // ダイアログボックステンプレート
  HWND hWndParent,      // オーナーウィンドウのハンドル
  DLGPROC lpDialogFunc  // ダイアログボックスプロシージャ
);

これはマクロです。実際はDialogBoxParam関数を使うようですが、 そっちはダイアログの初期値を渡すときに使います。 パラメータが1個増えるだけです。

次にダイアログプロシージャを作りますが、 その前にウィンドウのときと終了時の処理が違いますので、 それを説明します。

BOOL EndDialog(
  HWND hDlg,        // ダイアログボックスのハンドル
  INT_PTR nResult   // 返したい値
);

これを呼び出すだけです。簡単ですね。 nResultはDialogBoxParamやDialogBoxの戻り値となる値です。 通常はIDOKとかIDCANCELなど、閉じるときに押されたボタンなどのIDを渡します。 最後にダイアログベースのプログラムのスケルトンを載せておきます。 コピーして使ってください。

LRESULT CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),
        NULL,(DLGPROC)DlgProc);
    return 0;
}

LRESULT CALLBACK DlgProc(HWND in_hWnd,
                         UINT in_Message,
                         WPARAM in_wParam,
                         LPARAM in_lParam)
{
    switch ( in_Message )
    {
    case WM_COMMAND:
        switch ( LOWORD(in_wParam) )
        {
        case IDOK: case IDCANCEL:
            ::EndDialog(in_hDlg,LOWORD(in_wParam));
            break;
        }
        break;
    }
    return 0;
}

この終了の処理はOKボタンかキャンセルボタンが押されたら終了しろ、 というものですが、それだけでなく、 ダイアログの場合はウィンドウの右上の×ボタンが押されたときも IDCANCELが送られてきます。 また、ダイアログ上でEnterキーやEscキーを押してもそれぞれ終了します。