メッセージボックス


メッセージを表示

ここでは、Windowsプログラムのうち最も簡単なファンクションの一つであり
かつ奥が深いメッセージボックスについて説明します(ナメてかかっちゃいけません)

メッセージボックスはユーザーに何らかの警告をする時などに使用します
ウィンドウの生成作業の必要はなく、初心者でも簡単に扱えます
ついに、GUIプログラムの最初の一歩を踏み出しますよ♪

メッセージボックスを表示するには MessageBox() ファンクションを呼び出します
汎用性にかけますが、簡易ダイアログボックスとして活用することができます

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

第一引数には、オーナーウィンドウ(親ウィンドウ)を指定します
これは、今はないので NULL にするものとします
第一引数を NULL に指定すると、オーナーウィンドウを持たないメッセージボックスになります
HWND型などについても、後ほど詳しくて説明します

LPCTSTR型は、説明しなくても想像はつくでしょう
ワイド文字対応の定数文字列への 32 ビット ポインタです
CONST TCHAR * に当たる型ですね

ここで新しく UINT 型というものが出てきましたね
名前から想像つくように、これは整数型のデータ型です
UINTは、Win16(Windows Versions 3.0 と 3.1) では16ビット符号なし整数
それ以降の Win32 では 32ビット符合なし整数を表します

第二引数には、メッセージボックスに表示するメインの文字列を、
第三引数には、メッセージボックスのフレームに表示されるタイトルを指定します

最後の引数には、メッセージボックスの形態を表す定数を指定します
メッセージボックスは、ボタンの数やアイコンなどが複数用意されています

戻り値は、どのボタンが押されたかを表す整数を返します
戻り値について、後で詳しく説明します

さっそくメッセージボックスを表示させてみましょう
最後の引数は、とりあえずこの場は MB_OK を指定してください
#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			 TEXT("メッセージボックス") , MB_OK);
	return 0;
}
このプログラムを実行すると、OKボタンだけのシンプルなメッセージボックスが表示されます
プログラムはメッセージボックスが閉じられるまで終わることはありません

引数の最後に指定する定数ですが、非常に多彩な定数が用意されています
全てを覚えていては時間がかかるので、これは必要な時にヘルプを引くと良いでしょう

複数の項目を指定する時は、定数を論理和で加算します
#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			TEXT("メッセージボックス") ,
			MB_OK | MB_ICONINFORMATION);
	return 0;
}
このプログラムは、情報メッセージボックスを表示します
メッセージボックスに「i」のアイコンがついています


戻り値

メッセージボックスのボタンのうち、どのボタンが押されたのかは
MessageBox()関数の戻り値で知ることができます

押されたボタンのフラグは、やはり定数として用意されています
たとえば、押されたボタンが「はい」ボタンなら IDYES、「いいえ」なら IDNO に等しくなります
「はい」「いいえ」ボタンがあるメッセージボックスは MB_YESNO を第四引数に渡します
#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	int on_button;
	on_button = MessageBox(NULL , TEXT("Do you like Nekomimi?") ,
			TEXT("質問しています") , MB_YESNO | MB_ICONQUESTION );

	if (on_button == IDYES)
		MessageBox(NULL , TEXT("You are nice!") ,
				 TEXT("メッセージボックス") , MB_OK);
	else MessageBox(NULL , TEXT("Be Killed!") ,
				 TEXT("メッセージボックス") , MB_OK);
	return 0;
}
これだけでも、「はい」か「いいえ」だけでゲームとか作れそうですね
心理ゲームなどであれば、これだけでもその気になれば作れることでしょう

因みに MB_ICONQUESTION は、疑問符のアイコンを表示します


文字列フォーマット

C言語プログラマであれば、sprintf()関数の便利さは知っているでしょう
書式制御文字で表現した文字列をバッファに格納できます

Win32の場合、Unicodeや型の関係からsprintf()を使うわけにはいきません
そこでwsprintf()関数を用います

int wsprintf(LPTSTR lpOut , LPCTSTR lpFmt , ...);

lpOutには、フォーマットした文字列を格納するバッファを
lpFmtには、NULL で終わる書式制御文字列へのポインタを指定します
関数が成功すると、バッファに格納された終端の NULL を含まない文字数が返り
関数が失敗すると、書式制御文字列の長さよりも小さな値が返ります

書式制御文字列についてはC言語のprintf()関数と同じです
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	CHAR chStr[128];

	wsprintf(chStr , "インスタンスハンドル : %d" , hInstance);
	MessageBox(NULL , chStr , TEXT("Kitty on your lap") , MB_OK);

	return 0;
}
このプログラムでは、簡易のためCHAR配列を用いていますが
LPTSTR型のポインタに動的に確保した領域のポインタを渡したほうが良いでしょう

これをコンパイルして実行すると、hInstanceの整数表現がメッセージボックスに表示されます


文字列関数

Win32 が Unicode の関係で、ANSI C 標準の文字列関数を使えません
正確には、使えないというわけではありませんが、移植性が低下してしまいます
これは、上の wsprintf() 関数の例で十分理解してもらえたと思います

Win32 API は strcpy() や strcat() 等の文字列関数の Windows 版を提供しています
文字列をバッファにコピーするには lstrcpy() 関数を使います

LPTSTR lstrcpy(LPTSTR lpString1, LPCTSTR lpString2);

lpString1 は lpString2 をコピーするバッファへのポインタを指定します
バッファは、十分なサイズを持っている必要があります
lpString2 には、lpString1 にコピーする文字列へのポインタを指定します
関数が成功すれば、バッファへのポインタが、失敗すれば NULL が返ります
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	TCHAR * str1 = TEXT("Kitty on your lap");
	TCHAR str2[32];

	lstrcpy(str2 , str1);
	MessageBox(NULL , str2 , str2 , MB_OK);
	return 0;
}
プログラムを実行すると "Kitty on your lap" と書かれたメッセージボックスが出現します
ここから、str2 に str1 がコピーされていることが確認できます

これ以外に、文字列を指定文字数だけコピーする関数もあります
lstrcpyn() 関数は、指定文字列のポインタからバッファに指定文字数だけコピーします
LPTSTR lstrcpyn(
	LPTSTR lpString1 , LPCTSTR lpString2,
	int iMaxLength
);
lpString1 は lpString2 をコピーするバッファへのポインタを指定します
バッファは、十分なサイズを持っている必要があります
lpString2 には、lpString1 にコピーする文字列へのポインタを指定します
iMaxLength は、NULL 文字も含めたコピーする文字数を指定します
関数が成功すれば、バッファへのポインタが、失敗すれば NULL が返ります

しかし、この関数を使いこなすには、コピーする文字列の文字数を知る必要があります
定数として理解していれば確実ですが、そうではない文字列もあるでしょう
文字列の文字数を取得するには lstrlen() 関数を使います

int lstrlen(LPCTSTR lpString);

lpString には文字列へのポインタを指定します
関数は、バイト数(ANSI)、または文字数(Unicode)を返します
lstrcpyn() 関数は NULL 文字も含めた文字数を指定しなければならないのに対して
lstrlen() 関数は NULL 文字を含めない文字数を返すというところに注意してください
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	TCHAR * str1 = TEXT("Kitty on your lap");
	TCHAR str2[32];

	lstrcpyn(str2 , str1 , lstrlen(str1) + 1);
	MessageBox(NULL , str2 , str2 , MB_OK);
	return 0;
}
前のプログラムと結果は同じですが、処理過程が異なります
lstrcpyn() 関数を使って、文字列をバッファにコピーしています

文字列を結合するには、ANSI C で strcat() 関数を使っていました
これまでの名前の規則から予想できますが、Win32 では lstrcat() を使います

LPTSTR lstrcat(LPTSTR lpString1, LPCTSTR lpString2);

lpString1 は、lpString2 を NULL 文字から結合する文字列へのポインタ
このポインタが指す文字列の末尾に、lpString2 が結合されるので
このポインタが指すバッファは、十分なサイズを保有している必要があります
lpString2 には、lpString1 に結合させる文字列へのポインタを指定します
成功すれば、結合した文字列へのポインタ、失敗すれば NULL が返ります
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	TCHAR str1[128] = TEXT("Kitty on your lap\n");
	TCHAR * str2 = TEXT("Tokyo mew mew");

	lstrcat(str1 , str2);
	MessageBox(NULL , str1 , str2 , MB_OK);
	return 0;
}
プログラムを実行すれば、最初の str1 と str2 が結合した文字列が表示されます


MessageBox()

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

メッセージボックスを表示します

hWnd - オーナーウィンドウを指定します。NULLの場合はオーナーウィンドウを持ちません
lpText - メッセージボックスに表示するメインの文字列を指定します
lpCaption - タイトルバーに表示される文字列を指定します
uType - メッセージボックスの内容をフラグで指定します

戻り値 - メッセージボックスの押されたボタンを整数値で返します

定数表
定数解説
ボタン
MB_ABORTRETRYIGNORE [ 中止 ]、[ 再試行 ]、[ 無視 ] プッシュボタンを表示します
MB_OK [OK] プッシュボタンを表示します。デフォルトです
MB_OKCANCEL [OK]、[ キャンセル ] プッシュボタンを表示します
MB_RETRYCANCEL [ 再試行 ]、[ キャンセル ] プッシュボタンを表示します
MB_YESNO [ はい ]、[ いいえ ] プッシュボタンを表示します
MB_YESNOCANCEL [ はい ]、[ いいえ ]、[ キャンセル ] プッシュボタンを表示します
アイコン
MB_ICONEXCLAMATION
MB_ICONWARNING
感嘆符アイコンを表示します
MB_ICONINFORMATION
MB_ICONASTERISK
吹き出しの中に小文字の「 i 」があるアイコンを表示します
MB_ICONQUESTION 疑問符のアイコンを表示します
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND
停止
デフォルトプッシュ
MB_DEFBUTTON1 最初のボタンをデフォルトプッシュボタンにします
デフォルトです
MB_DEFBUTTON2 2 番目のボタンをデフォルトプッシュボタンにします
MB_DEFBUTTON3 3 番目のボタンをデフォルトプッシュボタンにします
MB_DEFBUTTON4 4 番目のボタンをデフォルトプッシュボタンにします
動作
MB_APPLMODAL ユーザーは、メッセージボックスに応答しなければ
hWnd パラメータで指定されたウィンドウで作業を継続することはできません
ほかのアプリケーションのウィンドウに移動して作業することはできます
デフォルトです
MB_SYSTEMMODAL メッセージボックスが
WS_EX_TOPMOST スタイルを持つ以外はMB_APPLMODAL と同じです
ユーザーがすぐに気付く必要があるような重大なエラーを通知するために使用します
MB_TASKMODAL hWnd パラメータが NULL のときに
現在のタスクに属するすべてのトップレベルウィンドウが無効になることを除いて
MB_APPLMODAL と同じです
呼び出し側のアプリケーション (またはライブラリ) が
有効なウィンドウのハンドルを持っておらず
かつ、ほかのアプリケーションを中断せずに
現在のアプリケーションのほかのウィンドウへの入力を禁止したいときに使用します
その他
MB_DEFAULT_DESKTOP_ONLY 現在入力を受け取るデスクトップは
デフォルトのデスクトップでなければなりません
それ以外の場合には、関数が失敗します
デフォルトのデスクトップは、ユーザーがログオンした後で
アプリケーションが動作するデスクトップです
MB_HELP [ヘルプ]プッシュボタンを追加します
ユーザーがヘルプボタンを選択したり F1 キーを押したりすると
ヘルプイベントが生成されます
MB_RIGHT テキストを右寄せします
MB_RTLREADING 右から左へテキストを表示します
ヘブライ語やアラビア語をサポートしているシステムで有効です
MB_SETFOREGROUND メッセージボックスをフォアグラウンドウィンドウにします
Windows システムは、内部で SetForegroundWindow 関数を呼び出します
MB_TOPMOST メッセージボックスを最前面ウィンドウ (WS_EX_TOPMOST) で作成します
MB_SERVICE_NOTIFICATION Windows NT 専用です
呼び出し側がユーザーにイベントを通知するサービスのときに指定します
ユーザーがログオンしていないときも
現在のアクティブなデスクトップにメッセージボックスを表示します
このフラグをセットするときは
hWnd パラメータに NULL を指定してください
MB_SERVICE_NOTIFICATION_NT3X Windows NT 専用です
この値は、Windows NT バージョン 3.51 で
MB_SERVICE_NOTIFICATION として定義された値と同じです
戻り値
IDABORT [中止]ボタンが選択されました
IDCANCEL [キャンセル]ボタンが選択されました
IDIGNORE [無視]ボタンが選択されました
IDNO [いいえ]ボタンが選択されました
IDOK [OK]ボタンが選択されました
IDRETRY [再試行]ボタンが選択されました
IDYES [はい]ボタンが選択されました

wsprintf()

int wsprintf(LPTSTR lpOut , LPCTSTR lpFmt , ...);

指定された引数を書式制御文字列にしたがってフォーマットし、バッファに格納します

lpOut - バッファへのポインタを指定します
lpFmt - NULL で終わる書式制御文字列へのポインタを指定します
... - 0 個以上の引数を指定します

戻り値 - 成功すると格納された文字数、失敗すると文字列の長さよりも小さな値

lstrcpy()

LPTSTR lstrcpy(LPTSTR lpString1, LPCTSTR lpString2);

文字列をコピーします

lpString1 - lpString2 をコピーするバッファへのポインタを指定します
lpString2 - lpString1 にコピーする文字列へのポインタを指定します

戻り値 - バッファへのポインタ、失敗すれば NULL

lstrcpyn

LPTSTR lstrcpyn(
	LPTSTR lpString1 , LPCTSTR lpString2,
	int iMaxLength
);
指定文字数だけ、文字列をコピーします

lpString1 - lpString2 をコピーするバッファへのポインタを指定します
lpString2 - lpString1 にコピーする文字列へのポインタを指定します
iMaxLength - コピーする NULL を含めた文字数を指定します

戻り値 - バッファへのポインタ、失敗すれば NULL

int lstrlen(LPCTSTR lpString)

文字列の文字数を返します

lpString - 調べる文字列へのポインタを指定します

戻り値 - 文字数を返します

lstrcat()

LPTSTR lstrcat(LPTSTR lpString1, LPCTSTR lpString2);

文字列を別の文字列に結合します

lpString1 - lpString2 を結合する文字列へのポインタ
lpString2 - lpString1 に結合させる文字列へのポインタを指定します

戻り値 - 結合した文字列へのポインタ、失敗すれば NULL



前のページへ戻る次のページへ