Registrando classes de janela

Uma classe de janela é compatível com um procedimento de janela. Seu aplicativo pode registrar uma classe de janela usando RegisterClassA ou RegisterClassW. Os novos aplicativos normalmente devem usar RegisterClassW.

Se o aplicativo registrar a classe de janela usando RegisterClassA, a função informará ao sistema operacional que as janelas da classe criada esperam que mensagens com parâmetros de texto ou caractere usem um conjunto de caracteres de página de código do Windows (ANSI ). O registro usando RegisterClassW permite que o aplicativo solicite que o sistema operacional passe parâmetros de texto de mensagens como Unicode. A função IsWindowUnicode permite que um aplicativo consulte a natureza de cada janela.

O exemplo a seguir mostra como registrar uma classe de janela de página de código do Windows e uma classe de janela Unicode e como gravar os procedimentos de janela para ambos os casos. Para os fins deste exemplo, todas as funções e estruturas são mostradas com os tipos de dados específicos "A" (ANSI) ou "W" (wide, Unicode). Usando as técnicas explicadas em Usando tipos de dados genéricos, você pode, como alternativa, escrever este exemplo para usar tipos de dados genéricos, para que ele possa ser compilado para usar páginas de código do Windows ou Unicode, dependendo se "UNICODE" está definido.

// 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);

O exemplo a seguir mostra a diferença entre lidar com a mensagem WM_CHAR em um procedimento de janela de página de código do Windows e um procedimento de janela 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;
}

Todo o texto em mensagens recebidas por AnsiWndProc é composto por caracteres de página de código do Windows. Todo o texto em mensagens recebidas por UniWndProc é composto por caracteres Unicode.

Usando Conjuntos de Caracteres e Unicode