メッセージボックス
メッセージを表示するダイアログ
アプリケーションからユーザーに対して何らかの情報を表示する最も簡単な方法はメッセージボックスを使用することです。
メッセージボックスは、簡単なテキスト情報や選択肢を表示できるダイアログボックスです。
(ダイアログボックス=必要に応じて一時的に表示される簡易的なウィンドウ)
メッセージボックスの表示はMessageBox
関数を使用します。
- int MessageBoxW(
HWND hWnd,
LPCWSTR lpText,
LPCWSTR lpCaption,
UINT uType
); - ウィンドウhWndをオーナーとするメッセージボックスを開く。
文字列lpTextは本文、文字列lpCaptionはタイトルに表示される。
戻り値はメッセージボックス上で押下されたボタンを示す値。
関数が失敗した場合は0を返す。
第一引数hWnd
はメッセージボックスを所有するウィンドウです。
ここで指定したウィンドウは、メッセージボックスが閉じられるまで操作不能となります。
(マウスクリック等でアクティブにしようとしてもメッセージボックスがアクティブになる)
このような仕組みのダイアログボックスはモーダルダイアログボックスといいます。
ここにはNULL
を指定することもできます。
(所有ウィンドウのないメッセージボックスになる)
第二引数lpText
はメッセージボックスの本文となる文字列です。
第三引数lpCaption
はメッセージボックスのタイトルバーに表示される文字列(キャプション)です。
NULL
を指定すると「エラー」という文字列が表示されます。
第四引数uType
はメッセージボックスに表示するボタンおよびアイコンの種類を示すフラグです。
これには以下の定数を組み合わせて指定することが出来ます。
ボタンの種類
ボタンの種類を示すフラグは以下の定数のいずれかを指定します。
定数 | 説明 |
---|---|
MB_OK | 「OK」ボタンのみを表示 (デフォルト) |
MB_OKCANCEL | 「OK」「キャンセル」ボタンを表示 |
MB_ABORTRETRYIGNORE | 「中止」「再試行」「無視」ボタンを表示 |
MB_YESNOCANCEL | 「はい」「いいえ」「キャンセル」ボタンを表示 |
MB_YESNO | 「はい」「いいえ」ボタンを表示 |
MB_RETRYCANCEL | 「再試行」「キャンセル」ボタンを表示 |
MB_CANCELTRYCONTINUE | 「キャンセル」「再試行」「続行」ボタンを表示 |
MB_HELP | 「ヘルプ」ボタンを追加 このボタンをクリックするとオーナーウィンドウに WM_HELP メッセージを送信する |
アイコン
アイコンの種類を示すフラグは以下の定数のいずれかを指定します。
(何も指定しない場合はアイコンなし)
定数 | 説明 |
---|---|
MB_ICONSTOP MB_ICONERROR MB_ICONHAND |
「停止」アイコンの表示 |
MB_ICONQUESTION | 「クエスチョン」(はてなマーク)アイコンの表示 このアイコンは意味があいまいになるため非推奨らしい |
MB_ICONEXCLAMATION MB_ICONWARNING |
「エクスクラメーション」(!マーク)アイコンの表示 (警告などに使用) |
MB_ICONINFORMATION MB_ICONASTERISK |
小文字の「i」マークのアイコンを表示 |
デフォルトのボタン
デフォルトのボタンを設定するには以下の定数のいずれかを指定します。
(最初にフォーカスがあるボタン。そのままEnterキーなどで選択できる)
定数 | 説明 |
---|---|
MB_DEFBUTTON1 | 最初のボタンがデフォルト (デフォルト) |
MB_DEFBUTTON2 | 2番目のボタンがデフォルト |
MB_DEFBUTTON3 | 3番目のボタンがデフォルト |
MB_DEFBUTTON4 | 4番目のボタンがデフォルト |
表示状態
メッセージボックスの表示に関するフラグは以下の定数のいずれかを指定します。
定数 | 説明 |
---|---|
MB_APPLMODAL | 通常のモーダルダイアログボックス (デフォルト) このメッセージボックスを閉じるまでオーナーウィンドウおよびその子ウィンドウは操作できない ただしポップアップウィンドウは操作可能 |
MB_SYSTEMMODAL | メッセージボックスは常に最前面に表示される ( WS_EX_TOPMOST )それ以外は MB_APPLMODAL と同じ |
MB_TASKMODAL | オーナーウィンドウにNULL を指定すると、現在のスレッドに属するすべてのトップレベルウィンドウが操作不能になるそれ以外は MB_APPLMODAL と同じ |
その他
その他のオプション用フラグです。
以下の定数は複数同時に指定することができます。
定数 | 説明 |
---|---|
MB_SETFOREGROUND | メッセージボックスを最前面に表示する (内部的にSetForegroundWindow関数を呼び出している) |
MB_DEFAULT_DESKTOP_ONLY | メッセージボックスはデフォルトデスクトップのみで表示可能 デフォルトデスクトップでない場合、既定のデスクトップに切り替えるまで制御を返さない。 オーナーウィンドウに NULL を指定しないと関数は失敗する |
MB_TOPMOST | 常に最前面に表示する ( WS_EX_TOPMOST スタイル) |
MB_RIGHT | テキストの右寄せ |
MB_RTLREADING | メッセージを右から左に表示する アラビア語などの右から読む言語用 |
MB_SERVICE_NOTIFICATION | ユーザーにイベントを通知するサービス用 現在ログオンしているユーザーがいない場合でもメッセージボックスを表示する オーナーウィンドウに NULL を指定しないと関数は失敗する |
戻り値
MessageBox関数の戻り値は、ダイアログ上で選択したボタンの種類を表す定数です。
定数 | 説明 |
---|---|
IDOK | 「OK」ボタン |
IDCANCEL | 「キャンセル」ボタン |
IDABORT | 「中止」ボタン |
IDRETRY | 「再試行」ボタン ( MB_ABORTRETRYIGNORE とMB_RETRYCANCEL の「再試行」ボタン) |
IDIGNORE | 「無視」ボタン |
IDYES | 「はい」ボタン |
IDNO | 「いいえ」ボタン |
IDTRYAGAIN | 「再試行」ボタン ( MB_CANCELTRYCONTINUE の「再試行」ボタン) |
IDCONTINUE | 「続行」ボタン |
メッセージボックスに「キャンセル」ボタンがある場合、右上の×ボタンやEscキーでも閉じることができます。
この場合の戻り値はIDCANCEL
になります。
また、MB_OK
(OKボタンのみ)の場合も×ボタンやEscキーで閉じることができ、この場合の戻り値はIDOK
になります。
サンプルコード
MessageBox関数のサンプルコードです。
#include <windows.h>
#include <strsafe.h>
//ウィンドウの生成等は省略
#define BUFFERSIZE 128
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static WCHAR buf[BUFFERSIZE];
static const WCHAR* format = L"戻り値: %s";
WCHAR* txt;
int ret;
switch (message)
{
case WM_PAINT: //ウィンドウの描画発生
GetClientRect(hWnd, &rect);
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc, buf, -1, &rect, DT_WORDBREAK);
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONUP:
ret = MessageBox(hWnd, L"メッセージボックスのテスト", L"情報", MB_RETRYCANCEL | MB_ICONINFORMATION);
switch (ret)
{
case IDOK:
txt = L"IDOK";
break;
case IDCANCEL:
txt = L"IDCANCEL";
break;
case IDABORT:
txt = L"IDABORT";
break;
case IDRETRY:
txt = L"IDRETRY";
break;
case IDIGNORE:
txt = L"IDIGNORE";
break;
case IDYES:
txt = L"IDYES";
break;
case IDNO:
txt = L"IDNO";
break;
case IDTRYAGAIN:
txt = L"IDTRYAGAIN";
break;
case IDCONTINUE:
txt = L"IDCONTINUE";
break;
default:
txt = L"なし";
break;
}
StringCchPrintf(buf, 32, format, txt);
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_DESTROY: //ウィンドウの破棄
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
ウィンドウ上をクリックするとメッセージボックスが表示されます。
いずれかのボタンをクリックしてメッセージボックスを閉じると、戻り値がウィンドウ上に表示されます。
MessageBox関数のフラグを色々変更して動作を確認してみてください。