Регистрация классов окон
Класс окна поддерживается процедурой окна. Приложение может зарегистрировать класс окна с помощью RegisterClassA или RegisterClassW. Новые приложения обычно должны использовать RegisterClassW.
Если приложение регистрирует класс окна с помощью RegisterClassA, функция сообщает операционной системе, что окна созданного класса ожидают, что сообщения с текстовыми или символьными параметрами будут использоваться кодовой странице Windows (ANSI) набор символов. Регистрация с помощью RegisterClassW позволяет приложению запросить операционную систему передавать текстовые параметры сообщений как Юникод. Функция IsWindowUnicode позволяет приложению запрашивать характер каждого окна.
В следующем примере показано, как зарегистрировать класс окна кодовой страницы Windows и класс окна Юникода и как записать процедуры окна для обоих случаев. В этом примере все функции и структуры отображаются с определенными типами данных A (ANSI) или W (wide, Юникод). Используя методы, описанные в использование универсальных типов данных, можно также написать этот пример для использования универсальных типов данных, чтобы его можно было скомпилировать для использования кодовых страниц Windows или Юникода в зависимости от того, определен ли "ЮНИКОД".
// 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);
В следующем примере показано различие между обработкой сообщения WM_CHAR в процедуре окна кодовой страницы Windows и процедурой окна Юникода.
// "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;
}
Все текстовые сообщения, полученные AnsiWndProc, состоят из символов кодовой страницы Windows. Все текстовые сообщения, полученные UniWndProc, состоят из символов Юникода.
Связанные разделы