ウィンドウ クラスの登録

ウィンドウ クラスは、ウィンドウ プロシージャでサポートされています。 アプリケーションでは、 RegisterClassA または RegisterClassW を使用してウィンドウ クラス を登録できます。 新しいアプリケーションでは、通常、 RegisterClassW を使用する必要があります。

アプリケーションが RegisterClassA を使用してウィンドウ クラスを登録する場合、関数は、作成されたクラスのウィンドウが、 Windows (ANSI) コード ページ 文字セットを使用するテキストまたは文字パラメーターを含むメッセージを想定していることをオペレーティング システムに通知します。 RegisterClassW を使用した登録により、アプリケーションは、メッセージのテキスト パラメーターを Unicode として渡すようにオペレーティング システムに要求できます。 IsWindowUnicode 関数を使用すると、アプリケーションは各ウィンドウの性質を照会できます。

次の例は、Windows コード ページ ウィンドウ クラスと Unicode ウィンドウ クラスを登録する方法と、両方のケースでウィンドウ プロシージャを記述する方法を示しています。 この例では、すべての関数と構造体が特定の "A" (ANSI) または "W" (ワイド、Unicode) データ型で表示されます。 「ジェネリック データ型の使用」で説明されている手法を使用して、この例を記述してジェネリック データ型を使用することもできます。これにより、"UNICODE" が定義されているかどうかに応じて、Windows コード ページまたは Unicode を使用するようにコンパイルできます。

// Register a Windows code page window class.

WNDCLASSA AnsiWndCls;

AnsiWndCls.style         = CS_DBLCLKS | CS_PARENTDC;
AnsiWndCls.lpfnWndProc   = (WNDPROC)AnsiWndProc;
AnsiWndCls.cbClsExtra    = 0;
AnsiWndCls.cbWndExtra    = 0;
AnsiWndCls.hInstance     = hInstance;
AnsiWndCls.hIcon         = NULL;
AnsiWndCls.hCursor       = LoadCursor(NULL, (LPTSTR)IDC_IBEAM);
AnsiWndCls.hbrBackground = NULL;
AnsiWndCls.lpszMenuName  = NULL;
AnsiWndCls.lpszClassName = "TestAnsi";

RegisterClassA(&AnsiWndCls);

// Register a Unicode window class.

WNDCLASSW UnicodeWndCls;

UnicodeWndCls.style         = CS_DBLCLKS | CS_PARENTDC;
UnicodeWndCls.lpfnWndProc   = (WNDPROC)UniWndProc;
UnicodeWndCls.cbClsExtra    = 0;
UnicodeWndCls.cbWndExtra    = 0;
UnicodeWndCls.hInstance     = hInstance;
UnicodeWndCls.hIcon         = NULL;
UnicodeWndCls.hCursor       = LoadCursor(NULL,(LPTSTR)IDC_IBEAM);
UnicodeWndCls.hbrBackground = NULL;
UnicodeWndCls.lpszMenuName  = NULL;
UnicodeWndCls.lpszClassName = L"TestUnicode";

RegisterClassW(&UnicodeWndCls);

次の例は、Windows コード ページ ウィンドウ プロシージャと Unicode ウィンドウ プロシージャで WM_CHAR メッセージを処理する場合の違いを示しています。

// "ANSI" Window Procedure

LRESULT CALLBACK AnsiWndProc(HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{

    // Dispatch the messages that can be received.

    switch (message)
    {
        case WM_CHAR:

            // wParam - the value of the key
            // lParam - (not used in this example)

            if (lstrcmpA("Q", (LPCSTR) wParam))
            {
                // ...
            }
            else
            {
                // ...
            }
            break;
        // Process other messages.
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Unicode Window Procedure

LRESULT CALLBACK UniWndProc(HWND hWnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
{

    // Dispatch the messages that can be received.

    switch (message)
    {
        case WM_CHAR:

            // wParam - the value of the key
            // lParam - (not used in this example)

            if (lstrcmpW(L"Q", (LPCWSTR) wParam))
            {
                // ...
            }
            else
            {
                // ...
            }
            break;
        // Process other messages.
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

AnsiWndProc によって受信されたメッセージ内のすべてのテキストは、Windows コード ページ文字で構成されます。 UniWndProc によって受信されたメッセージ内のすべてのテキストは、Unicode 文字で構成されます。

Unicode と文字セットの使用