最も基本的なプロジェクト

これから、WIN32APでプログラムを作る方法を学習していきます。その中でも、一番基礎的なものが、これから紹介する、メッセージボックスと呼ばれるウィンドウの出力です。

サンプルプログラム

WIN32APIのサンプルの中でもっとも単純なものの一つである、メッセージボックスの表示を取り上げます。メッセージボックスは簡単な関数で描画することが出来るので、非常に便利で、様々な場面で今後も利用していくことになります。まずは以下のプロジェクトを実行してみてください。

win32proj1-1:WinMain.cpp
ダウンロード
// ***************************************
// ダイアログを表示するサンプル
// ***************************************

//必要なヘッダーファイルのインクルード
#define STRICT
#include <windows.h>
#include <tchar.h>

//--------------------------------------------
// Name:WinMain()
// Desc:アプリケーションのエントリー関数
//--------------------------------------------
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szStr, INT iCmdShow)
{
	MessageBox(NULL, _T(""), _T(""), MB_OK);

	return 0;
}

実行結果は、以下のようになります。(図1-1.)

図1-1.最も基本的なメッセージボックスの表示

最も基本的なメッセージボックスの表示

このプログラムを実行すると、「OK」ボタンのみが表示された、非常に簡素なメッセージボックスが出現します。OKボタンを押すと、メッセージボックスは消えて、プログラムは終了します。

プログラムの仕組み

ヘッダファイル

では、一体、このプログラムはどのような仕組みになっているのでしょうか?

WIN32APIでプログラムを作る際には、windows.hをインクルードする必要があります。これは、WIN32APIを利用するために必要なインクルードファイルで、今後WIN32APIを必要とするアプリケーションには必ず必要になります。また、tchar.hは、文字コードを国際対応するために必要なライブラリのヘッダフィルです。_Tマクロを使うために必要です。

ヘッダファイルの読み込み
#include <windows.h>
#include <tchar.h>

WinMain

通常の、C言語やC++言語と、WIN32APIのプログラムの違いの大きな点が、前者が、main関数内に処理を記述するのに対し、WinMain関数内に記述するという点です。このサンプルでは、13行目がそれに相当します。

ここには様々な引数がついていますが、ここではその詳細については省略します。ここでは、このように記述する必要があるとだけ押さえておきましょう。

Message関数

15行目のMessageBox関数が、メッセージボックス出力のための関数になっています。仕様は、以下のようになっています。

printf()関数の呼び出し
int MessageBox(
    HWND hWnd,            // オーナーウィンドウのハンドル
    LPCTSTR lpText,       // メッセージボックス内のテキスト
    LPCTSTR lpCaption,   // メッセージボックスのタイトル
    UINT uType             // メッセージボックスのスタイル
);

この関数はメッセージボックスの作成、表示、操作を行います。メッセージボックスは、アプリケーション定義のタイトルとメッセージ、および任意の定義済みのアイコンとプッシュボタンの組み合わせによって構成されます。

このサンプルでは、テキストおよび、タイトルには何も入力されていないので、文字は出力されません。それに対し、uTypeは、「MB_OK」としているため、OKボタンが出力されるのです。ウィンドウハンドルに関しては、ここでは難しいので省略しますが、ここではNULLを指定しています。

メッセージボックスのスタイル

メッセージボックスのスタイルには、以下のようなものがあります。(表1-1.)

表1-1.メッセージボックスのスタイル(ボタン)
意味
MB_CANCELTRYCONTINUE [キャンセル]、[再実行]、[続行]の各プッシュボタンを表示します。
MB_HELP [ヘルプ]ボタンを追加します。
MB_OK [OK]プッシュボタンだけを表示します。これは既定のメッセージボックスタイプです。
MB_OKCANCEL [OK]、[キャンセル]の各プッシュボタンを表示します。
MB_RETRYCANCEL [再試行]、[キャンセル]の各プッシュボタンを表示します。
MB_YESNO [はい]、[いいえ]の各プッシュボタンを表示します。
MB_YESNOCANCEL [はい]、[いいえ]、[キャンセル]の各プッシュボタンを表示します。

また、メッセージボックスにアイコンを表示することも可能です。その際のスタイルは、以下のようになります。(表1-2.)

表1-2.メッセージボックスのスタイル(アイコン)
意味
MB_ICONEXCLAMATION,MB_ICONWARNING 感嘆符(!)アイコンを表示します。
MB_ICONINFORMATION, MB_ICONASTERISK 丸の中に小文字の「i」が描かれたアイコンを表示します。
MB_ICONQUESTION 疑問符(?)アイコンを表示します。
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND 停止マークアイコンを表示します。

エスケープシーケンス

また、この中にある¥nは、改行を表す特殊な文字です。この文字があると、文字列はそこで改行され、続く文字は次の行から改行されます。この改行記号のように、¥マークで始まる文字を、エスケープシーケンスと言います。エスケープシーケンスは表1-1のように、他にも沢山あります。

様々な表示例

では、実際にこれらを利用して、様々なメッセージボックスを表示してみましょう。MessageBoxの引数をいろいろ変えて、実行してみましょう。win32proj1-1の、WinMain.cppの15行目を以下のように変更して実行してみてください。

win32proj1-1:WinMain.cpp(改訂部分)
MessageBox(NULL, _T("処理は成功しました。"), _T("情報"), MB_OK);

すると、以下のような結果が得られます。

図1-2.メッセージボックスに具体的なパラメータを入れた例

メッセージボックスに具体的なパラメータを入れた例

テキストの表示

lpTextの部分のテキストが、メッセージボックスの中央に、lpCaptionの中には、ウィンドウ左上に出る情報として文字列が出力されます。

この二つの文字列を囲っている、_Tというマクロは、文字列をUNICODE(ユニコード)という文字コードに変更するために必要です。一般的に、ウィンドウズのプログラムの中の文字コードは、SHIFT-JIS(シフトジス)と呼ばれる文字コードですが、このマクロをつけることにより、_TCHARデータ型に変更されます。

現在、WIN32APIの文字列情報はUNICODEに対応できるように設計されており、このデータ型は、必要に応じてUNICODEに変更できるというコードです。そのため、このような方法を用いて文字コードを変更する必要があるのです。

ボタンの種類とアイコンの種類

ボタンおよびアイコンの種類の指定をするuTypeには、一つしか値を入れることができません。しかし、ここでボタンの種類とアイコンの種類という複数のパラメータを|という記号を用いて間を区切って指定します。このサンプルの例だと、

ボタンとアイコンのパラメータの指定方法の例
MB_OK | MB_ICONINFORMATION

これにより、ボタンが「OK」ボタン、アイコンが「!」の形に変わります。この部分を変更することにより、様々なタイプのメッセージボックスを出力することができます。

この部分に実際に様々な値を入れて、出力結果を確認してみましょう。