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キーを押してもそれぞれ終了します。