Registrieren von Fensterklassen
Eine Fensterklasse wird von einer Fensterprozedur unterstützt. Ihre Anwendung kann eine Fensterklasse entweder mithilfe von RegisterClassA oder RegisterClassW registrieren. Neue Anwendungen sollten in der Regel RegisterClassW verwenden.
Wenn die Anwendung die Fensterklasse mithilfe von RegisterClassA registriert, informiert die Funktion das Betriebssystem darüber, dass die Fenster der erstellten Klasse Meldungen mit Text- oder Zeichenparametern erwarten, dass ein Codepagezeichensatz von Windows (ANSI) verwendet wird. Die Registrierung mit RegisterClassW ermöglicht es der Anwendung, das Betriebssystem anzufordern, Textparameter von Nachrichten als Unicode zu übergeben. Die IsWindowUnicode-Funktion ermöglicht es einer Anwendung, die Art der einzelnen Fenster abzufragen.
Das folgende Beispiel zeigt, wie Sie eine Windows-Codepage-Fensterklasse und eine Unicode-Fensterklasse registrieren und die Fensterprozeduren für beide Fälle schreiben. Für die Zwecke dieses Beispiels werden alle Funktionen und Strukturen mit den spezifischen Datentypen "A" (ANSI) oder "W" (wide, Unicode) dargestellt. Mithilfe der unter Verwenden generischer Datentypen erläuterten Verfahren können Sie dieses Beispiel alternativ schreiben, um generische Datentypen zu verwenden, sodass es entweder für Windows-Codepages oder Unicode kompiliert werden kann, je nachdem, ob "UNICODE" definiert ist.
// 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);
Das folgende Beispiel zeigt den Unterschied zwischen der Behandlung der WM_CHAR Meldung in einer Windows-Codepagefensterprozedur und einer Unicode-Fensterprozedur.
// "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;
}
Der gesamte Text in Nachrichten, die von AnsiWndProc empfangen werden, besteht aus Windows-Codepagezeichen. Der gesamte Text in Nachrichten, die von UniWndProc empfangen werden, besteht aus Unicode-Zeichen.
Zugehörige Themen