WisdomSoft - for your serial experiences.

メッセージボックス

任意のテキストを表示し、ユーザーの入力があるまでプログラムを待機するメッセージボックスを解説します。簡単な確認処理やエラーメッセージの表示などに応用できます。

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

Windows 専用のアプリケーションを生成することはできましたが、これまでのプログラムはウィンドウを何も表示しません。まずは、内容を何も持たない単純なウィンドウだけを表示したいところですが、実際にウィンドウを表示するには Windows に対してさまざまな登録作業をしなければなりません。

そこで、ウィンドウを生成する作業に入る前にメッセージボックスを表示させて、プログラムの動作を確認してみましょう。メッセージボックスは、プログラムの流れを一時停止して、ユーザーに対して何らかの文字列を表示するダイアログボックスの一種です。「OK」ボタンなど、何らかのボタンが押されてメッセージボックスが閉じられるまで制御は返りません。また、文字列を簡単に表示することができるため、簡素なデバッグにも使われます。一般的には、アプリケーションのエラーや情報を表示したり、ユーザーの確認を促すために用いられます。

メッセージボックスを表示するには MessageBox() 関数を呼び出します。

MessageBox() 関数
int MessageBox(
  HWND hWnd,
  LPCTSTR lpText,
  LPCTSTR lpCaption,
  UINT uType
);

また新しい型が登場しました。HWND 型はウィンドウハンドルと呼ばれ、個々のウィンドウを示すユニークな値です。HWND 型の値はウィンドウそのものを識別するために使われ、ウィンドウを制御するために必要となります。MessageBox() 関数は、メッセージボックスを保有する親ウィンドウを hWnd パラメータに指定しなければなりません。親ウィンドウを持たない場合は NULL を指定できます。この時点ではウィンドウを表示する方法を解説していないので、この場では NULL を指定します。

lpText パラメータには、メッセージボックスに表示するテキストとなる文字列を指定します。

lpCaption パラメータには、ダイアログのタイトルバーに表示される文字列を指定します。このパラメータには NULL を指定することも可能で、NULL を指定した場合はデフォルトの文字 "エラー" が設定されます。

uType パラメータは、このメッセージボックスの種類を表す MB_ から始まる定数のフラグを設定します。単純に文字を表示するだけのメッセージボックスならば MB_OK を指定するだけでよいのですが、その他にもいくつかの種類が存在します。例えば MB_YESNO を指定すれば、「はい」ボタンと「いいえ」ボタンで構成される選択可能なダイアログが表示されます。

ユーザーがどのボタンを押したかは、MessageBox() 関数の戻り値から判断することができます。MessageBox() 関数がシステムのメモリ不足などで失敗した場合は 0 が返されます。

コード1
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MessageBox(NULL, TEXT("Stand by Ready!!"), TEXT("Set up"), MB_OK);
	return 0;
}
実行結果
コード1 実行結果

コード1は、指定した文字列を通知するメッセージボックスを表示します。MessageBox() 関数は、表示されたメッセージボックスが閉じられるまで制御を返しません。

メッセージボックスは「OK」ボタンのほかに「キャンセル」、「中止/再試行/無視」、「はい/いいえ」などのボタンを付けることができます。ボタンを指定する定数を表1にまとめます。

表1 メッセージボックスのボタン
定数 意味 実行例
MB_ABORTRETRYIGNORE 「中止」、「再試行」、「無視」ボタンを表示 MB_ABORTRETRYIGNORE
MB_CANCELTRYCONTINUE 「キャンセル」、「再試行」、「続行」ボタンを表示 MB_CANCELTRYCONTINUE
MB_OK 「OK」ボタンを表示 MB_OK
MB_OKCANCEL 「OK」、「キャンセル」ボタンを表示 MB_OKCANCEL
MB_RETRYCANCEL 「再試行」、「キャンセル」ボタンを表示 MB_RETRYCANCEL
MB_YESNO 「はい」、「いいえ」ボタンを表示 MB_YESNO
MB_YESNOCANCEL 「はい」、「いいえ」、「キャンセル」ボタンを表示 MB_YESNOCANCEL
MB_HELP 組み合わせることで「ヘルプ」ボタンを追加 MB_HELP

上記の定数に MB_ICON から始まる定数を組み合わせることでメッセージボックス上にシステムで用意されたアイコンを表示できます。例えば、警告メッセージであれば MB_ICONWARNING 定数を指定することで!マークのアイコンを加えられます。アイコンに関する定数は表2にまとめます。

表2 メッセージボックスのアイコン
定数 意味 実行例
MB_ICONEXCLAMATION
MB_ICONWARNING
感嘆符・警告アイコン MB_ICONEXCLAMATION
MB_ICONINFORMATION
MB_ICONASTERISK
情報アイコン MB_ICONINFORMATION
MB_ICONQUESTION 疑問符アイコン MB_ICONQUESTION
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND
停止・エラーアイコン MB_ICONSTOP

複数の定数が割り当てられているアイコンも存在しますが、どれも結果は同じです。例えば、警告アイコンは MB_ICONEXCLAMATION 定数と MB_ICONWARNING 定数のどちらを使っても同じです。

MB_YESNO などのボタンを設定する定数と MB_ICON で始まるアイコン関連定数を組み合わせるには、以下のように論理和演算子 | を用います。

MessageBox(NULL, TEXT("Stand by Ready!!"), TEXT("MessageBox"), MB_YESNO | MB_ICONQUESTION);
図1 MB_YESNO と MB_ICONQUESTION の組み合わせ
図1 MB_YESNO と MB_ICONQUESTION の組み合わせ

複数のボタンを表示して戻り値を調べれば、ユーザーが選択したボタンの結果によってプログラムを分岐させることができます。 MessageBox() 関数は、メッセージボックスを閉じたボタンに応じる値を返します。この値は ID から始まる表3のような定数として用意されています。 

表3 メッセージボックスの戻り値
定数 意味
IDABORT 「中止」ボタンが選択された
IDCANCEL 「キャンセル」ボタンが選択された
IDIGNORE 「無視」ボタンが選択された
IDNO 「いいえ」ボタンが選択された
IDOK 「OK」ボタンが選択された
IDRETRY 「再試行」ボタンが選択された
IDYES 「はい」ボタンが選択された
 

MB_YESNO 定数を用いて「はい」ボタンと「いいえ」ボタンを持つメッセージボックスを表示し、関数の戻り値を調べれば、ユーザーが選択したボタンによってプログラムを分岐できます。

コード2
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int r;
	r = MessageBox(
		NULL, TEXT("そんな装備で大丈夫か?"), TEXT("話をしよう"),
		MB_YESNO | MB_ICONQUESTION
	);

	if (r == IDYES) {
		MessageBox(
			NULL, TEXT("神は言っている\nここで死ぬ定めではないと"),
			TEXT("大丈夫だ、問題ない"),
			MB_OK | MB_ICONINFORMATION 
		);
	}
	else {
		MessageBox(
			NULL, TEXT("神は言っている\nすべてを救えと"),
			TEXT("一番いいのを頼む"),
			MB_OK | MB_ICONINFORMATION
		);
	}

	return 0;
}
実行結果
コード1 実行結果 コード1 実行結果 コード1 実行結果

コード2は、最初に「はい」ボタンと「いいえ」ボタンのメッセージボックスを表示します。MessageBox() 関数は押されたボタンに対応する値を返すので、r 変数でこれを受け取っています。このプログラムのメッセージボックスで押される可能性のあるボタンは「はい」または「いいえ」ボタンのいずれかです。これらのボタンは、それぞれ IDYES と IDNO という定数に対応するので、これに等しいかどうかを調べることによって、どちらのボタンが押されたのか調べられます。