メッセージを表示する

GUI を持たないコンソールアプリケーションの場合、C 言語の printf() 関数で簡単に文字列を表示できました。ちょっとした変数の値や処理の流れを確認する程度であれば、デバッガを使わなくても printf() 関数でデバッグ用の文字列を出力できましたが、Windows アプリケーションの場合はテキストの描画にも面倒な手続きが必要になります。

もちろん Visual C++ を使っていればデバッガを使って指定したブレークポイントでプログラムを停止させ、変数の値やプログラムの流れを調べられますが、ちょっとした文字列を画面に素早く表示できると便利です。今回紹介する MessageBox() 関数は、メッセージボックスと呼ばれる小さなダイアログ上に、任意のテキストを表示する機能を提供します。面倒なウィンドウの生成や初期化などは不要で、簡単に文字列を画面に表示できます。アプリケーション内で発生した、何らかの警告やエラーの通知に応用できます。

ゼロからはじめるWindows API - WinMain 関数 すべての始まり編
C言語の学習および環境の構築は下記を参考にしてください
1.ゼロからはじめるC言語 - 環境構築編
2.ゼロからはじめるC言語 - 関数編
3.ゼロからはじめるC言語 - 型・定数編
4.ゼロからはじめるC言語 - 変数編
5.ゼロからはじめるC言語 - 選択編
6.ゼロからはじめるC言語 - 繰り返し編
7.ゼロからはじめるC言語 - 配列編
8.ゼロからはじめるC言語 - 構造体編
9.ゼロからはじめるC言語 - 自作関数編
10.ゼロからはじめるC言語 - ポインタ編

MessageBox() 関数

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

パラメータ

hWnd このメッセージボックスを表示する親ウィンドウのハンドル
lpText メッセージボックスに表示する文字列
lpCaption メッセージボックスのタイトルバーに表示される文字列
uType メッセージボックス内に表示するボタンやアイコンなどを指定する値の組み合わせ
戻り値 選択されたボタンを表す値

この関数を呼び出すと、ユーザーの操作によってメッセージボックスが閉じられるまで、関数は制御を返しません。

hWnd パラメータには、このメッセージボックスを表示する親ウィンドウを指定します。親ウィンドウを持たない場合は NULL を指定してください。lpText パラメータにはメッセージボックス上に表示するテキストとなる文字列へのポインタを、lpCaption パラメータには、このメッセージのタイトルを表す文字列を指定します。タイトルに NULL を指定すると、既定のタイトルである「エラー」という文字列が使われます。

uType パラメータには、メッセージボックス上に表示するボタンやアイコンなど、メッセージボックスの内容を表す定数を指定します。ここに指定する値は MB_ から始まる定数として定義されています。この定数はフラグとして論理和演算子 | で組み合わせて利用できます。

関数の戻り値は、どのボタンの選択によってメッセージボックスを閉じたのかを表す値です。この値は ID から始まる定数として定義されています。「OK」ボタンが押されたならば IDOK、「キャンセル」ボタンが押されたなら IDCANCEL に等しい値が返されます。

もっとも単純な「OK」ボタンだけを持つメッセージボックスを表示するには uType パラメータに MB_OK を指定します。この場合、「OK」ボタンが押された結果として返される値は IDOK となります。メッセージを表示するだけが目的であれば、戻り値を調べる必要はありません。「はい」や「いいえ」など、ユーザーに何らかの選択を要求した場合に、戻り値を調べます。

サンプル 01

#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "なんくるないさー", "メッセージ", MB_OK);
    return 0;
}

図 01 サンプル 01 実行結果

このプログラムは、メッセージボックスを表示して終了するだけのプログラムです。メッセージボックスが表示されている間、関数は制御を返しません。よって、表示されたメッセージボックスを閉じるまでプログラムの処理は停止します。「OK」ボタンを押してメッセージボックスを閉じると、 MessageBox() 関数から制御が戻りプログラムが終了します。

もし、上のプログラムを実行してメッセージボックスのテキストが文字化けするようであれば、プロジェクトの「構成プロパティ」から「全般」→「文字セット」を「マルチ バイト文字セットを使用する」に設定してください。文字セットについては、次回に説明します。

uType パラメータに指定する値を変更すれば、表示されるボタンやアイコンを変更できます。メッセージボックスの種類によって、適切な値を選択してください。たとえば、重大なエラーを通知する場合は MB_ICONERROR 定数と組み合わせてエラー用のアイコンを表示するべきです。

uType パラメータの値 実行結果
MB_OKCANCEL
MB_YESNO
MB_YESNOCANCEL
MB_RETRYCANCEL
MB_ABORTRETRYIGNORE
MB_ICONEXCLAMATION
MB_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERISK
MB_ICONQUESTION
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND

複数の定数が割り当てられているアイコンも存在します。たとえば、警告アイコンを表示するには MB_ICONEXCLAMATION または MB_ICONWARNING のどちらを使ってもかまいません。

表示するボタンの種類を指定する定数と、表示するアイコンの種類を指定する定数を組み合わせるには論理和演算子 | を使います。MB_OKCANCEL | MB_ICONINFORMATION であれば、次のような結果が得られます。

図 02 ボタンとアイコンの組み合わせ

メッセージボックスはデザイン面での柔軟性に欠けますが、警告メッセージなどユーザーの注意を引きたい場合に便利です。