EternalWindows
基礎 / Windows API

Winowsアプリケーションを開発するには、 まず何よりWindows APIを覚えることが重要であるといえます。 APIとは、Application Programming Interfaceの略で、アプリケーションから システムが提供しているサービスへアクセスするための関数セットのことを指しています。 Windows上で動作する全てのアプリケーション(コンソールも含め)は、 Windows APIを呼び出せなければ事実上何もできないため、 たとえどのような言語でアプリケーションを開発しても 最終的にはWindows APIが呼ばれるという仕組みになっています。 たとえば、コンソールアプリケーションで呼び出していたfopenのような関数は、 内部でファイルをオープンするWindows APIを呼び出しています。

Windows APIを呼び出すのは、基本的にC言語で書かれたWindowsアプリケーションのみですが、 コンソールアプリケーションからでも呼び出すことができるというのは覚えておいてください。 windows.hは、Windows APIとされている数多くの関数が定義されているヘッダーファイルを インクルードしているため、windows.hをインクルードするだけで、 コンソールアプリケーションからもWindows APIを呼び出すことができるのです。 勿論、コンソールアプリケーションの主な作業はコンソールへの入出力ですから、 画像を表示したり音を再生する関数を呼び出すようなことはありませんが、 重要なデータをファイルではなくレジストリに保存したい場合などは、 レジストリ系の関数を呼び出すことがあります。

しかし、私たちが作成していくアプリケーションはWindowsアプリケーションですから、 まず覚えなければならないのはウインドウを表示する関数だと思われます。 このウインドウを表示するというのはなかなか難しいところがあるため、 今回はMessageBoxというメッセージボックスを表示するWindows APIを学習し、 WindowsAPIの特徴と基本的な使い方を押さえていきたいと思います。 MessageBoxは、次のように定義されています。

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

第1引数であるhWndの型はHWNDとなっています。 いきなり新しい型が現れましたが、よく見ると型の先頭はHで始まっています。 Hはハンドルの意味で、HWNDはウインドウハンドルと呼ばれます。 プログラムではこのウインドウハンドルでウインドウを識別します。 lpTextは、メッセージボックスに表示する文字列を指定します。 LPCTSTRという型は、文字列のポインタを受け取る型です。 LPCTSTRのCはconstの意味で、関数は受け取った引数を変更しないことを意味します。 lpCaptionは、メッセージボックスのタイトルに表示する文字列を指定します。 uTypeは、メッセージボックスの内容を表すフラグを指定します。 メッセージボックスの内容とは、ボタンがいくつ配置されるか、 疑問符のアイコンを表示するのかなどのことを意味しています。

上記の説明だけでは何のことかよく分かりませんが、 実際にプログラムを動作させれば直ぐに意味を掴めます。 今回のプログラムは、メッセージボックスを表示するだけの単純なものです。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	MessageBox(NULL, TEXT("メッセージ"), TEXT("タイトル"), MB_OK);

	return 0;
}

プログラムを実行するとメッセージボックスが表示されたはずです。 これは勿論、プログラムでMessageBox関数を呼び出しているからです。 引数を確認してみましょう。

MessageBox(NULL, TEXT("メッセージ"), TEXT("タイトル"), MB_OK);

第1引数はウインドウハンドルですが、NULLを指定しても問題ありません。 NULLとは値なし(ゼロ)のことで、幾つかの関数はNULLを受け取った場合にデフォルトの動作を行ったり、その引数を考慮しなかったりします。 また、何らかのアドレスを返す関数は、処理が失敗したときに無効のポインタとしてNULLを返すことも珍しくありません。 今の段階ではこの引数を特に意識する必要はありません。 第2引数は、メッセージボックスのテキストでした。 文字列を指定するのは当然ですが、奇怪なことに文字列がTEXTという括弧でくくられています。

TEXT("メッセージ")

このTEXTというのは実はマクロです。 Windowsプログラミングでは文字列をTEXTマクロで囲うべきとされています。 前節のTCHAR型といい、今回のTEXTマクロといい、 Windowsプログラミングでは文字列に妙な制限をかけているように思えますが、 今の段階で無理にその意味を知る必要はありません。 第3引数は、メッセージボックスのタイトルです。 これもTEXTマクロで文字列を指定します。

先ほど、関数の引数にNULLを指定するとデフォルトの動作を行うことがあると述べましたが、 このことはMessageBoxの第2引数と第3引数にも該当します。 MessageBoxを次のように呼び出してみてください。

MessageBox(NULL, NULL, NULL, MB_OK);

この場合、メッセージボックスのテキストは空白になりますが、 タイトルはエラーという文字列になったはずです。 つまり、MessageBoxの第2引数はデフォルトでは空白で、 第3引数のデフォルトはエラーという文字列になります。 この第3引数のデフォルトの効果はなかなか有用ではないでしょうか。 たとえば、何らかの関数を呼び出して処理に失敗した場合、 その旨を知らせるメッセージボックスを表示したいとします。 このようなとき、MessageBoxの第3引数にNULLを指定すればエラーと表示されるので、 意図的に引数にエラーという文字列を指定する手間が省けるのです。

続いて、MessageBoxの第4引数ですがMB_OKとなっています。 MessageBoxでは、0が警告のアイコンとか、1が疑問符のアイコン、 といった具合で内容を伝えるわけではなく、内容を示す専用の定数を使います。 MB_OKは何もアイコンを表示しません。 しかし、MB_ICONWARNINGを指定した場合は、警告のアイコンが表示されるでしょう。 定数を扱うことにより、名前から内容を推測することが可能になるのです。 MessageBoxの第4引数が取り得る定数の一部を以下に示します。

定数 意味
MB_ABORTRETRYIGNORE [中止]、[再試行]、[無視]の各プッシュボタンを表示。
MB_OK [OK]プッシュボタンだけを表示。
MB_YESNO [はい]、[いいえ]の各プッシュボタンを表示。
MB_ICONWARNING 感嘆符(!)アイコンを表示。
MB_ICONQUESTION 疑問符(?)アイコンを表示。

説明文を読むよりも、実際にこれらの定数を第4引数に指定してプログラムを実行したほうが感覚を掴めるでしょう。 このような数多くの定数は覚えるものではなく、 必要に応じてマイクロソフトのリファレンスなどを参照することになります。

ところで、MessageBoxを呼び出した後に、return文が直ぐに実行されないのは何故でしょうか。 これは、MessageBoxがコードの進行をブロック(一時的に止める)しているからです。 MessageBoxはユーザー入力があるまでループするように設計されており、 入力が行われたときに制御を返します(returnする)。


戻る