前回は、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()ができることを調べるプログラムを作ってみよう。