ウィンドウクラスとは、「どのようなウィンドウを作るかの定義」のことです。
ウィンドウクラスには、アイコン、メニュー、カーソルなどと、ウィンドウプロシージャ(ウィンドウメッセージを処理する関数)が定義されています。
ウインドウの表示 - インコのWindowsSDK を修正して、ウインドウを表示するようにします。
流れ
1.WinMain()の中で、今回新たに作成する作成するMyRegisterClass()を呼び出す。
2.WNDCLASSEX構造体で、ウィンドウクラスの登録します。
WNDCLASS構造体は、ウィンドウクラスに関する情報を格納する構造体です。
typedef struct { UINT cbSize; // WNDCLASSEX構造体のサイズ UINT style; // ウインドウスタイル WNDPROC lpfnWndProc; // ウィンドウプロシージャのアドレス int cbClsExtra; // 0固定 int cbWndExtra; // 0固定 HINSTANCE hInstance; // WinMain()のインスタンスハンドル HICON hIcon; // 使用するアイコン HCURSOR hCursor; // マウスカーソル HBRUSH hbrBackground; // ウインドウのクライアント領域の背景色 LPCTSTR lpszMenuName; // メニュー LPCTSTR lpszClassName; // Windowクラスの名前 HICON hIconSm; // 使用する小さいアイコン } WNDCLASSEX, *PWNDCLASSEX;
構造体メンバの説明
構造体メンバ | 意味 | 解説 |
---|---|---|
cbSize | WNDCLASSEX構造体のサイズ |
sizeof(WNDCLASSEX)としてください。 UINTは32ビットの環境の場合、32ビットの符号なし整数型です。 |
style | ウインドウスタイル | CS_HREDRAW(水平方向のサイズ変更があったら全体を描き直す)と、 CS_VREDRAW(垂直方向のサイズ変更で全体を描き直す)を指定 |
lpfnWndProc | ウィンドウプロシージャのアドレス | ここでは、デフォルトの動作をするDefWindowProc()を指定 |
hIcon | タスクバーやタイトルバーに表示されるアイコン |
HICON型は、アイコンのハンドル LoadIcon()でアイコンをロードして使います。 |
hCursor | ウィンドウのクライアントエリア上のマウスカーソル |
HCURSOR型は、カーソルのハンドル LoadCursor()でカーソルをロード。 |
hbrBackground | ウインドウのクライアント領域の背景色 |
HBRUSH型は、ブラシのハンドル デフォルトの色である、(HBRUSH)(COLOR_WINDOW+1)とします。 |
lpszMenuName | メニュー | メニューは今回ないのでNULL |
lpszClassName | Windowクラスの名前 | CreateWindow()の第1引数と同じ |
hIconSm | 使用する小さいアイコン | LoadIcon()でアイコンをロード |
hIconSmメンバのない、WNDCLASS構造体もあります。これを使ってもかまいません。
3.WNDCLASSEX構造体を、RegisterClass()で登録。
ATOM RegisterClass( CONST WNDCLASSEX *lpwcx // ウインドウクラス(WNDCLASSEX構造体) );
戻り値はATOM型です。ATOM型とは、
typedef WORD ATOM;
となっていますので、WORD型(2バイト[=16ビット] 符号なし整数)と同じ意味です。
4.InitInstance()にある、CreateWindow()の第1引数をWNDCLASSEX構造体のメンバlpszClassNameと同じにします。
ソースコードの入力
ソースコードは下記のように入れてください。
test.cpp
#include <windows.h> // このコード モジュールに含まれる関数の宣言を転送します: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MyRegisterClass(hInstance); // アプリケーションの初期化を実行します: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } return 0; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = DefWindowProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL , IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = TEXT("HP"); wcex.hIconSm = LoadIcon(NULL , IDI_APPLICATION); return RegisterClassEx(&wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: メイン ウィンドウを作成します。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(TEXT("HP"), TEXT("HP"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
実行すると分かると思いますが、一瞬だけウインドウが表示された後、すぐにウインドウが閉じてしまいます。