このプログラムはスケルトンプログラムと呼ばれ、Windowsアプリケーションの最も基本となるもので、図1のように、ただウィンドウが表示されるだけのプログラムである。
このプログラムは大きく2つの関数からなっており、プログラムの流れは、前のページの図にあったとおりである。
WinMain関数はプログラム起動と同時に呼ばれる関数で、標準C/C++言語のmain関数に相当するものである。 このプログラムでは、WinMainの中でウィンドウを作成するに先立ってウィンドウクラスというものを登録して、このウィンドウクラス型に基づいたウィンドウを生成している。 ウィンドウクラスとはウィンドウの特徴を示すもの、ウィンドウの種類と考えると分かりやすい。あらかじめOS側で定義されているウィンドウクラスもいくつかあり、例えばボタンをつくるにはCreateWindowの第1引数に"button"を渡せばよい。 メッセージループでは、マウスイベントやキーボードイベントなど、OS側から送られてくる様々なメッセージを各ウィンドウのウィンドウ関数へ振り分ける処理を行っており、このメッセージループは、WM_QUIT(PostQuitMessage()によって発行される)が送られるまで延々と繰り返される。 プログラム中のWindowProc関数は、ウィンドウに対するメッセージ処理を記述する部分でウィンドウ関数と呼ばれる。 ここではウィンドウ右上の×が押されたときにプログラムが終了するような処理を記述し、その他の処理は標準的なウィンドウ処理に任せている。 OS側から送られてくるメッセージにはWM_DEStrOY以外にも、例えば以下のようなものがある。
メッセージ | タイミング |
WM_LBUTTONDOWN | マウスの左クリックを押した. |
WM_RBUTTONDOWN | マウスの右クリックを押した. |
WM_MOUSEMOVE | マウスが移動した |
WM_KEYDOWN | キーボードを押した. |
WM_CREATE | CreateWindowが呼ばれて一番はじめに送られるメッセージ |
WM_PAINT | 再描画が要求された(ウィンドウ画面への描画はここで行う). |
WM_TIMER | インターバル・タイマの割り込み.SetTimer()で設定可. |
WM_COMMAND | ユーザがメニューからコマンドを選択した,またはウィンドウ上のボタンを押した. |
WM_MOVE | ウィンドウの位置が変わった(ウィンドウが移動した). |
WM_DESTROY | ウィンドウがユーザにより破壊されようとしている. |
WM_QUIT | アプリケーションが自らPostQuitMessage関数を呼び出した. |
WM_USER | アプリケーション独自のメッセージ.このタイミングはアプリケーションで自由に規定できる. |
プログラム中のウィンドウクラス登録のところを見ると分かるとおり、
ウィンドウ関数はウィンドウクラス単位で指定することができる。 なお、関数名はWindowProcである必要は全くありません。 分かりやすい名前をつけるようにしよう。 関数が参照される部分より後に関数の実体を記述する場合は、プログラムの先頭で
でプロトタイプ宣言をしておく。
ところで,WinMain関数のなかでもう一つ見慣れないものがある。 それはLPCWSTRとかTEXTなど,文字列型に関する型定義やプリプロセッサ用マクロ定義である。 どうもUNIXで学んできたテキスト文字とは勝手が違うようである。 これについて気になる諸君にはここで詳しく説明する。