Registrazione di classi di finestre
Una classe finestra è supportata da una routine finestra. L'applicazione può registrare una classe finestra usando RegisterClassA o RegisterClassW. Le nuove applicazioni devono in genere usare RegisterClassW.
Se l'applicazione registra la classe window usando RegisterClassA, la funzione informa il sistema operativo che le finestre della classe creata prevedono messaggi con parametri di testo o carattere per usare una tabella codici Windows (ANSI) set di caratteri. La registrazione tramite RegisterClassW consente all'applicazione di richiedere al sistema operativo di passare parametri di testo dei messaggi come Unicode. La funzione IsWindowUnicode consente a un'applicazione di eseguire query sulla natura di ogni finestra.
Nell'esempio seguente viene illustrato come registrare una classe della finestra della tabella codici di Windows e una classe finestra Unicode e come scrivere le procedure della finestra per entrambi i casi. Ai fini di questo esempio, tutte le funzioni e le strutture vengono visualizzate con i tipi di dati specifici "A" (ANSI) o "W" (wide, Unicode). Usando le tecniche illustrate in Using Generic Data Types, è possibile scrivere in alternativa questo esempio per usare tipi di dati generici, in modo che possa essere compilato per usare tabelle codici di Windows o Unicode, a seconda che sia definito "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);
Nell'esempio seguente viene illustrata la differenza tra la gestione del messaggio WM_CHAR in una routine della tabella codici di Windows e una routine della finestra Unicode.
// "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;
}
Tutto il testo nei messaggi ricevuti da AnsiWndProc è composto da caratteri tabella codici di Windows. Tutto il testo nei messaggi ricevuti da UniWndProc è composto da caratteri Unicode.
Argomenti correlati