ウィンドウプログラミングの主な流れ
Windows APIを使ったウィンドウプログラミングの主な流れは、次のようになる。
- クラス名を用意
- ウィンドウプロシージャを作成(WindowProc())
- ウィンドウクラス(WNDCLASS)構造体の変数を作成(先程作成したWindowProc()を登録、クラス名を指定)
- ウィンドウクラス(WNDCLASS)構造体の変数を登録(RegisterClass())
- ウィンドウを作成(CreateWindowEx()、クラス名を指定)
- ウィンドウを表示(ShowWindow())
- ウィンドウメッセージループを作成(GetMessage()、TranslateMessage()、DispatchMessage())
最初は、もっとざっくりと流れを理解しておいたほうがよいかもしれない。次のような流れと考えておくと、わかりやすいと思う。
- ウィンドウクラスを作成
- ウィンドウクラスを登録
- ウィンドウを作成
- ウィンドウを表示
- ウィンドウメッセージループを構築
今回は、この「ウィンドウクラス」というものについて説明していく。
クラス名を用意
ウィンドウクラスを作成していくのだが、ウィンドウプログラミングを行うにあたってまずはそれよりも前に、「クラス名」を定める必要がある。これは対象となるアプリケーションを特定することになるもので、アプリケーションに対して一意にすることが求められる。例えば、製品としてアプリケーションを開発する場合は、そのアプリケーションを公開するURLをクラス名にするなど、一意に特定できるようなものにする必要がある。
このサンプルでは、次のような文字列をクラス名にしてある。
クラス名を用意
// ウィンドウクラス名
const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";
クラス名は、このあとに作成するウィンドウクラス構造体において、ウィンドウの作成時においても使用するので、ここでは定数として定義してある。まずはユニークな名前をつけるものと考えてもらえればと思う。
ウィンドウクラスを作成
Windows APIによるウィンドウプログラミングでは、まず「ウィンドウクラス」と呼ばれる、複数のウィンドウに共通する動作セットを作成して登録する。基盤となる共通の動作を設定しておくようなイメージだ。これは「ウィンドウクラス」と呼ばれているが、C++といったオブジェクト指向プログラミング言語におけるクラスではなく、WNDCLASSという構造体として用意されている。この構造体を用意して必要なメンバをはめ込んでいくというのが最初に行うべきことということになる。
サンプルコードでは次の部分がこれに該当している。
ウィンドウクラスの作成部分
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;