次の方法で共有


ウィンドウ クラスの登録

ウィンドウ クラスは、ウィンドウ プロシージャでサポートされています。 アプリケーションは、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 および文字セット を使用する