Registrieren von Fensterklassen
Eine Fensterklasse wird von einer Fensterprozedur unterstützt. Ihre Anwendung kann eine Fensterklasse entweder mithilfe RegisterClassA- oder RegisterClassW-registrieren. Neue Anwendungen sollten in der Regel RegisterClassW-verwenden.
Wenn die Anwendung die Fensterklasse mithilfe von RegisterClassAregistriert, informiert die Funktion das Betriebssystem, dass die Fenster der erstellten Klasse Nachrichten mit Text- oder Zeichenparametern erwarten, eine Windows(ANSI)-Codepage Zeichensatz zu verwenden. Die Registrierung mit RegisterClassW- ermöglicht der Anwendung, das Betriebssystem anzufordern, Textparameter von Nachrichten als Unicode-zu übergeben. Mit der IsWindowUnicode--Funktion kann eine Anwendung die Art der einzelnen Fenster abfragen.
Das folgende Beispiel zeigt, wie Sie eine Windows-Codeseitenfensterklasse und eine Unicode-Fensterklasse registrieren und die Fensterprozeduren 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) dargestellt. Mithilfe der in Using Generic Data Typeserläuterten Techniken können Sie alternativ dieses Beispiel schreiben, um generische Datentypen zu verwenden, sodass es kompiliert werden kann, um entweder Windows-Codeseiten 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-Codeseitenfensterprozedur 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 Von AnsiWndProc empfangene Text besteht aus Windows-Codeseitenzeichen. Alle von UniWndProc empfangenen Nachrichten bestehen aus Unicode-Zeichen.
Verwandte Themen