Registrazione di classi di finestre
Una classe di finestra è supportata da una routine di finestra. L'applicazione può registrare una classe di finestra usando RegisterClassA o RegisterClassW. Le nuove applicazioni devono in genere usare RegisterClassW.
Se l'applicazione registra la classe della finestra usando RegisterClassA, la funzione informa il sistema operativo che le finestre della classe creata prevedono messaggi con parametri di testo o carattere per l'uso di un set di caratteri della tabella codici Windows (ANSI). La registrazione con RegisterClassW consente all'applicazione di richiedere al sistema operativo di passare i 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 di finestra Unicode e come scrivere le procedure delle finestre per entrambi i casi. Ai fini di questo esempio, tutte le funzioni e le strutture vengono visualizzate con i tipi di dati "A" (ANSI) specifici o "W" (wide, Unicode). Usando le tecniche descritte in Uso di tipi di dati generici, è possibile scrivere in alternativa questo esempio per usare tipi di dati generici, in modo che possa essere compilato per usare le pagine 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 di 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 della tabella codici di Windows. Tutto il testo nei messaggi ricevuti da UniWndProc è composto da caratteri Unicode.
Argomenti correlati