ウインドウクラスの登録

ウィンドウクラスとは、「どのようなウィンドウを作るかの定義」のことです。
ウィンドウクラスには、アイコン、メニュー、カーソルなどと、ウィンドウプロシージャ(ウィンドウメッセージを処理する関数)が定義されています。

ウインドウの表示 - インコの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;
}

実行すると分かると思いますが、一瞬だけウインドウが表示された後、すぐにウインドウが閉じてしまいます。