Регистрация классов Window

Оконный класс поддерживается процедурой окна. Приложение может зарегистрировать класс окна с помощью RegisterClassA или RegisterClassW. Как правило, новые приложения должны использовать RegisterClassW.

Если приложение регистрирует класс окна с помощью RegisterClassA, функция сообщает операционной системе, что окна созданного класса ожидают, что сообщения с текстовыми или символьными параметрами будут использовать набор символов кодовой страницы Windows (ANSI). Регистрация с помощью RegisterClassW позволяет приложению запрашивать у операционной системы передачу текстовых параметров сообщений в виде Юникода. Функция IsWindowUnicode позволяет приложению запрашивать характер каждого окна.

В следующем примере показано, как зарегистрировать класс окон кодовой страницы Windows и класс окон Юникода, а также как написать процедуры окна в обоих случаях. Для целей этого примера все функции и структуры показаны с конкретными типами данных "A" (ANSI) или "W" (широкий, Юникод). Используя методы, описанные в статье Использование универсальных типов данных, можно также написать этот пример для использования универсальных типов данных, чтобы его можно было компилировать для использования кодовых страниц 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 , состоит из символов Юникода.

Использование Юникода и наборов символов