windowsプログラムを作るにあたって、
ウィンドウを作成するためには、
まず、ウィンドウクラスをシステムに登録する必要があります。
登録は、
WNDCLASSEX構造体に必要な情報を設定して、
RegisterClassEx 関数を使ってシステムに登録します。
まず、WNDCLASSEX構造体についてです。
Unicodeバージョンの宣言です。
Unicodeバージョンはタグの名称の最後にWがつきます。
(Wはワイド文字のWと思われます)
typedef struct tagWNDCLASSEXW {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, *NPWNDCLASSEXW, *LPWNDCLASSEXW;
構造体メンバーについて見ていきます。
1.UINT cbSize;
UINT型です。この構造体のサイズ (バイト単位)を設定します。
cbSizeのcbはcount of byteの略です。バイト数と言ったところでしょうか。
構造体のサイズは、sizeof(WNDCLASSEX)で求めることができます。
(WNDCLASSEXはWINDCLASSEXWに展開されます)
2.UINT style;
クラススタイルを設定します。
クラススタイルは、CS_で始まる定数で定義されています。
ここでは、ウィンドウがサイズが水平方向に変更があった場合に再描画を行う。CS_HREDRAWと、垂直方向に変更があった場合に再描画をおこなう。CS_VREDRAWを設定します。
3. WNDPROC lpfnWndProc;
WNDPROC型です。
ウィンドウプロシージャを設定します。
ウィンドウズプロシージャはシステムからウィンドウに送られたメッセージを処理する関数です。これはコールバック関数というもので、必要となったときにシステムから呼ばれるということから、コールバックという名称になってます。
ここでは、とりあえずデフォルトのウィンドウプロシージャ(DefWindowProc)を設定しておきます。
lpfnWndProcのlはLongのl、pはポインタ、fnは関数を表しています。
4. int cbClsExtra;
ウィンドウ クラス構造体の後に割り当てる余分なバイト数。使いませんので0を設定します。
5. int cbWndExtra;
ウィンドウ インスタンスの後に割り当てる余分なバイト数。使いませんので0を設定します。
6. HINSTANCE hInstance;
クラスのウィンドウ プロシージャを含むインスタンスへのハンドル。wWinMain関数で受け取ったインスタンスハンドルを設定します。
7. HICON hIcon;
ウィンドウに表示されるアイコンのハンドル。ここでは、システムの既定のアイコンを使用しますので、NULLを設定します。
8. HCURSOR hCursor;
ウィンドウに表示されるカーソルのハンドルで。ここでは、変更しないため NULL を設定ます。
9. HBRUSH hbrBackground;
背景を塗るブラシのハンドル。色で指定もできます。
色で指定する場合は標準システム カラーである必要があります。COLOR_で始まる定数です。
(値 1 を選択した色に追加する必要があります)。
色の値が指定されている場合は HBRUSH型に変換する必要があります。
ここでは、(HBRUSH)(COLOR_BACKGROUND + 1)となります。
(HBRUSH)はCOLOR_BACKGROUND + 1をHBRUSH型へ変換(キャスト)します。
10. LPCWSTR lpszMenuName
ウィンドウのデフォルトのメニューです。ここでは、使用しませんのでNULLを設定します。
lpszMenunameのszはzeroでおわる文字列を示しています。C言語では文字列の終わりは0です。
11. LPCWSTR lpszClassName;
ウィンドウクラスの名前を設定します。システムに登録できる名前は一意なので、他のウィンドウクラスと重ならないようにします。
12. HICON hIconSm;
ウィンドウ クラスに関連付けられている小さなアイコンへのハンドル。
ここでは、アイコンがないのでNULLに設定します。
以上でウィンドウクラスの構造体を設定できました。