ダイアログボックスの表示(モーダル)[Win32SDK]



モーダルダイアログを簡単に表示させるには DialogBoxマクロを使います。 実際の内部ではCreateWindow系関数を使ってダイ
アログを生成・表示しています。このマクロはEndDialogマクロが呼び出されるまで、制御が戻ってきません。このマクロの戻り値
EndDialogマクロの第2引数です。

int DialogBox(
  HINSTANCE hInstance,  /*アプリケーションのインスタンス*/
  LPCTSTR lpTemplate,  /*ダイアログテンプレートを示す文字列*/
  HWND hWndParent, /*親ウィンドウのウィンドウハンドル*/
  DLGPROC lpDialogFunc /*ダイアログウィンドウプロシージャのアドレス*/
);


lpDialogFuncはダイアログウィンドウプロシージャのアドレスです(ある関数の関数名自体は、その関数のアドレスを表わします)。
ダイアログウィンドウプロシージャはダイアログ上で発生したメッセージを受ける関数です。ダイアログボックスを作ったときは、
ダイアログひとつに対しダイアログウィンドウプロシージャひとつ作らなくてはいけません。ダイログウィンドウプロシージャは以下
のように定義します。

BOOL CALLBACK DialogProc(
  HWND hwndDlg, /* ダイアログボックスのウィンドウハンドル*/
  UINT uMsg, /* メッセージ*/
  WPARAM wParam, /* パラメーター1*/
  LPARAM lParam /* パラメーター2*/
);

普通のウィンドウプロシージャとは違い戻り値はBOOL型になっています。また、返す値は以下のように決めます。

・WM_INITDIALOGメッセージを処理した時、SetFocus関数でダイアログ上のコントロールにフォーカスを割当てたときは
FALSEを、そうでない場合はTRUEを返す。

・WM_INITDIALOGメッセージ以外のメッセージを処理した時、TRUEを返す。

・メッセージを処理しなかった場合、FALSEを返す。


ダイアログを閉じるにはEndDialogマクロを使います。

BOOL EndDialog(
  HWND hDlg, /* 閉じるダイアログのウィンドウハンドル*/
  int nResult /* DialogBoxマクロが返す値*/
);