メッセージボックス

メッセージを表示するダイアログ

アプリケーションからユーザーに対して何らかの情報を表示する最も簡単な方法はメッセージボックスを使用することです。
メッセージボックスは、簡単なテキスト情報や選択肢を表示できるダイアログボックスです。
(ダイアログボックス=必要に応じて一時的に表示される簡易的なウィンドウ)

メッセージボックスの表示は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_ICONERRORアイコン
MB_ICONQUESTION 「クエスチョン」(はてなマーク)アイコンの表示
このアイコンは意味があいまいになるため非推奨らしい
MB_ICONQUESTIONアイコン
MB_ICONEXCLAMATION
MB_ICONWARNING
「エクスクラメーション」(!マーク)アイコンの表示
(警告などに使用)
MB_ICONEXCLAMATIONアイコン
MB_ICONINFORMATION
MB_ICONASTERISK
小文字の「i」マークのアイコンを表示
MB_ICONINFORMATIONアイコン

デフォルトのボタン

デフォルトのボタンを設定するには以下の定数のいずれかを指定します。
(最初にフォーカスがあるボタン。そのまま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_ABORTRETRYIGNOREMB_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関数のサンプル

ウィンドウ上をクリックするとメッセージボックスが表示されます。
いずれかのボタンをクリックしてメッセージボックスを閉じると、戻り値がウィンドウ上に表示されます。
MessageBox関数のフラグを色々変更して動作を確認してみてください。