Registrieren von Fensterklassen
Eine Fensterklasse wird von einer Fensterprozedur unterstützt. Ihre Anwendung kann eine Fensterklasse mithilfe von RegisterClassA oder RegisterClassWregistrieren. Neue Anwendungen sollten in der Regel RegisterClassW verwenden.
Wenn die Anwendung die Fensterklasse mit registerClassAregistriert, informiert die Funktion das Betriebssystem darüber, dass die Fenster der erstellten Klasse Nachrichten mit Text- oder Zeichenparametern erwarten, dass sie einen Windows (ANSI)-Codepage-Zeichensatz verwenden. Die Registrierung mithilfe von RegisterClassW ermöglicht der Anwendung, das Betriebssystem anzufordern, Textparameter von Nachrichten als Unicodezu übergeben. Mit der IsWindowUnicode-Funktion kann eine Anwendung die Art der einzelnen Fenster abfragen.
Das folgende Beispiel zeigt, wie sie eine Windows Codepagefensterklasse und eine Unicode-Fensterklasse registrieren und die Fensterproz amp;en für beide Fälle schreiben. Für dieses Beispiel werden alle Funktionen und Strukturen mit den spezifischen Datentypen "A" (ANSI) oder "W" (wide, Unicode) angezeigt. Mithilfe der unter Verwenden von generischen Datentypenerläuterten Techniken können Sie dieses Beispiel alternativ schreiben, um generische Datentypen zu verwenden, sodass es kompiliert werden kann, um entweder Windows Codepages oder Unicode zu verwenden, 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-Nachricht 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, der von AnsiWndProc empfangen wird, besteht aus Windows Codepagezeichen. Der gesamte Text in Nachrichten, der von UniWndProc empfangen wird, besteht aus Unicode-Zeichen.