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