前回は、Microsoft C/C++とWindows APIを使ってダイアログボックスを表示するサンプルを取り上げ、最も基本的なビルドから実行までを説明した。今回は前回取り上げたダイアログボックスを深堀りしていく。ダイアログボックスはソースコードがシンプルでありつつも、挙動を変えるGUIの部品であり、最初に触れるにはちょうどよいのだ。

MessageBox()関数を知る

前回、MessageBox()関数でダイアログを生成できるという話をしたが、もう少し追ってみよう。まず、MessageBox()関数のマニュアルを見ておきたい。これでを読めば大体のことは把握できると思う。

MessageBox()関数はモーダルダイアログボックスを表示する関数だ。次のような書式で呼び出すことになっている。

int MessageBox(
  [in, optional] HWND    hWnd,
  [in, optional] LPCTSTR lpText,
  [in, optional] LPCTSTR lpCaption,
  [in]           UINT    uType
);

引数として指定するパラメータの意味は次のとおりだ。

パラメータ 内容
HWND hWnd 作成するモーダルダイアログボックスのオーナーウィンドウのハンドラ。NULLを指定するとオーナーウィンドウなしの状態でモーダルダイアログボックスが生成される
LPCTSTR lpText モーダルダイアログボックスに表示するメッセージテキスト
LPCTSTR lpCaption モーダルダイアログボックスのタイトル。NULLを指定した場合「Error」がタイトルとして使われる
UINT uType 表示するボタン、表示するアイコン、デフォルトボタン、モーダルの種類、そのほかモーダルダイアログボックスに関する挙動を変更する各種フラグを指定

ダイアログボックスのタイトル(lpCaption)とメッセージ(lpText)は任意のテキストを指定することができる。表示するアイコンはあらかじめ用意されているシステムアイコンから選択するほか、表示するボタンもあらかじめ用意されているものを指定することで利用する仕組みになっている。

指定する4つ目のパラメータであるuTypeに指定するフラグが、MessageBox()で表示されるダイアログのUI/UXを設定している。ここには、次のフラグを指定できるようになっている。

ボタンの種類 内容
MB_OK 「OK」
MB_OKCANCEL 「OK」「キャンセル」
MB_ABORTRETRYIGNORE 「中止」「再試行」「無視」
MB_YESNOCANCEL 「はい」「いいえ」「キャンセル」
MB_YESNO 「はい」「いいえ」
MB_RETRYCANCEL 「再試行」「キャンセル」
MB_CANCELTRYCONTINUE 「キャンセル」「再実行」「続行」
MB_HELP 「OK」「ヘルプ」
アイコンの種類 内容
MB_ICONEXCLAMATION 感嘆符のアイコン
MB_ICONWARNING 感嘆符のアイコン
MB_ICONINFORMATION (i)アイコン
MB_ICONASTERISK (i)アイコン
MB_ICONQUESTION クエスチョンマークアイコン。非推奨。後方互換性の目的でのみ提供されている
MB_ICONSTOP 停止アイコン
MB_ICONERROR 停止アイコン
MB_ICONHAND 停止アイコン
デフォルトボタン 内容
MB_DEFBUTTON1 第1ボタンをデフォルトで選択(デフォルトの挙動)
MB_DEFBUTTON2 第2ボタンをデフォルトで選択
MB_DEFBUTTON3 第3ボタンをデフォルトで選択
MB_DEFBUTTON4 第4ボタンをデフォルトで選択
モーダル挙動 内容
MB_APPLMODAL 引数で指定されたオーナーウィンドウでの作業を続ける前に作成したモーダルダイアログボックスに応答する必要がある。ただし、ほかのスレッドのウィンドウに対しては操作を行うことができる。モーダルが指定されていなかった場合のデフォルトの挙動
MB_SYSTEMMODAL MB_APPLMODALと同じだが、WS_EX_TOPMOSTが指定されている。メモリ不足など重大で潜在的に有害なエラーなどを通知する場合に使われる
MB_TASKMODAL MB_APPLMODALと同じだが、オーナーウィンドウハンドラがNULLの場合には現在のスレッドの所属するすべてのトップレベルウィンドウは無効化される
そのほかの挙動 内容
MB_DEFAULT_DESKTOP_ONLY 現在の入力デスクトップがデフォルトのデスクトップではなかった場合、ユーザーがデフォルトのデスクトップへ切り替えるまでMessageBoxによるreturnを待機
MB_RIGHT テキストを右側調整
MB_RTLREADING ヘブライ語およびアラビア語のシステムにおいてメッセージとキャプションテキストを右から左読み順で表示する
MB_SETFOREGROUND メッセージボックスをフォアグラウンドボックスに変更(内部でSetForegroundWindow()をコール)
MB_TOPMOST WS_EX_TOPMOSTウィンドウスタイル指定でモーダルダイアログボックスを作成
MB_SERVICE_NOTIFICATION パソコンにログオンしているユーザーがいない場合でもアクティブなデスクトップにメッセージボックスを表示する指定。オーナーハンドラはNULLであり必要がう。この指定はリソースの枯渇などきわめて限られた状態でのみ使用することが推奨されている
MessageBox()返り値 内容
IDOK 「OK」ボタンが押された
IDCANCEL 「キャンセル」ボタンが押された
IDABORT 「中止」ボタンが押された
IDRETRY 「再試行」ボタンが押された
IDIGNORE 「無視」ボタンが押された
IDYES 「はい」ボタンが押された
IDNO 「いいえ」ボタンが押された
IDTRYAGAIN 「再実行」ボタンが押された
IDCONTINUE 「継続」ボタンが押された

このようにシンプルなMessageBox()のモーダルダイアログボックスだが、必要に応じてボタンやアイコンまたはそのほかの挙動を変更できる。MessageBox()ができることを調べるプログラムを作ってみよう。