WindowsAPI メッセージボックス


 

さてさて、windows.hを読み込むことは分かりましたが。このままでは今までのC言語と何も変わらないね。
早速ウインドウを表示して画像を表示したりとかしたいところだけど。ウインドウをつくるまえに、ちょっと知っておきたいもの。
メッセージボックスです。

〜とにかくやってみよう〜

とにかくこれを実行してみてください。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			PSTR lpCmdLine,
			int nCmdShow){

	MessageBox(NULL,TEXT("本文だよ"),TEXT("たいとるだよ"),MB_OK);		
	
	return 0;
}

実行するとこんなのが出ると思います。

プログラムの青い部分が追加されましたね。
これがメッセージボックス関数ってやつで、これを使うといとも簡単にメッセージボックスを作ることができるわけ。
引数だけ渡せばウインドウズが作ってくれる。

使い方は簡単で、引数は4つだけ。
1つ目は NULLですけど、親ウインドウを指定する所。ここはまだやってないので、その時が来たら説明します(この言い回しなんかカッコいいな)
2つ目は 本文
3つ目は タイトルバーに表示する文字
4つ目は メッセージボックスのタイプです。
これを渡すだけでウインドウズがメッセージボックスを作ってくれます。ボタン押されるまで処理を返さないので
プログラムの次の行へは進みません。

使い方は簡単だけど、気になるのがTEXT("")ってやつだね。
これは関数ではありません。マクロです。
なぜ MessageBox(NULL,"本文だよ","たいとるだよ",MB_OK)
って書いてはだめなのか。
試しにやってみましょうか。

 

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			PSTR lpCmdLine,
			int nCmdShow){

	MessageBox(NULL,"本文だよ","たいとるだよ",MB_OK);		
	
	return 0;
}

僕のパソコンでは、実行したらこうなりました。

文字化けしてますね。どういうことか?
ポイントはマルチバイト文字とUNICODEってやつです。
例えば主に半角英数字は8ビット 日本語は16ビットを使って表してるのは知ってますか?
8ビットだと256文字までしか保存出来ないので日本語の漢字はとてもじゃないけど入らないわけです。そこで16ビット使うわけですが
同じ16ビットで文字を表すにもマルチバイト文字とUNICODE(ワイド文字)ってのがあるわけです。
普通にプログラムに文字を書いたんじゃ 「えっこれどっちなの?どっちで書いてあるの??」
ってなっちゃいます。実は、普通に書いただけではマルチバイト文字として読み取られます。
が、僕のパソコンの場合UNICODEが定義されてるので UNICODEでマルチバイト文字を表示しようとしたのでトラブルがおきました。

解決策は「これはUNICODE(ワイド文字)だよ!」と言う事です。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			PSTR lpCmdLine,
			int nCmdShow){

	MessageBox(NULL,L"本文だよ",L"たいとるだよ",MB_OK);		
	
	return 0;
}

""の前にLをつければいいんです。これでこの文字はワイド文字になってます。
これで文字化けはなくなりました。
でも問題が1つ。
UNICODEが定義されてなければ 逆にLをつけてUNICODEにしたら文字化けしてしまいます。
困った問題です。
そこで、 UNICODEが指定されていたらLをつけて されてなければつけないというマクロ。TEXT()マクロが用意されているわけです

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			PSTR lpCmdLine,
			int nCmdShow){

	MessageBox(NULL,TEXT("本文だよ"),TEXT("たいとるだよ"),MB_OK);		
	
	return 0;
}

こうすることで、UNICODEが用意されていようがいまいが、ちゃ〜んと文字を同じ文字列型で処理することが出来ます。

 

〜メッセージボックスのタイプ〜

さっきのメッセージボックスは タイプMB_OKでしたが。他にも色々あります

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
			HINSTANCE hPrevInstance,
			PSTR lpCmdLine,
			int nCmdShow){

	int a;
	a = MessageBox(NULL,TEXT("ボクのこと好き?"),TEXT("たいとるだよ"),MB_YESNO);		
	if (a==IDYES)MessageBox(NULL,TEXT("やっぱり(^^*"),TEXT("たいとるだよ"),MB_OK);
	if (a==IDNO)MessageBox(NULL,TEXT("そんなこといってぇ〜分かってるんだぞ(^^"),TEXT("たいとるだよ"),MB_OK);

	return 0;
}

説明はいらないよね?
MB_YESNOというタイプです。
返り値がその結果になってるわけです。
YESならIDYESって具合にねっ。

まとめ・・・

int MessageBox(親ウインドウ、本文、タイトル、タイプ)

  指定した親ウインドウの子ウインドウとしてメッセージボックスを出す。
  タイプで色々選ぶことができて、押したボタンは返り値として受け取ることができる
 例)MessageBox(NULL,TEXT("ほんぶん"),TEXT("たいとるだよ"),MB_OK);


TEXT()マクロ
UNICODEとマルチバイト文字の解決法。

 

ホームへ