Registrar clases de ventana

Un procedimiento de ventana admite una clase de ventana. La aplicación puede registrar una clase de ventana mediante RegisterClassA o RegisterClassW. Normalmente, las nuevas aplicaciones deben usar RegisterClassW.

Si la aplicación registra la clase de ventana mediante RegisterClassA, la función informa al sistema operativo de que las ventanas de la clase creada esperan mensajes con parámetros de texto o carácter para usar un juego de caracteres de página de códigos de Windows (ANSI ). El registro mediante RegisterClassW permite a la aplicación solicitar al sistema operativo que pase parámetros de texto de mensajes como Unicode. La función IsWindowUnicode permite a una aplicación consultar la naturaleza de cada ventana.

En el ejemplo siguiente se muestra cómo registrar una clase de ventana de página de códigos de Windows y una clase de ventana Unicode y cómo escribir los procedimientos de ventana para ambos casos. Para los fines de este ejemplo, todas las funciones y estructuras se muestran con los tipos de datos "A" (ANSI) o "W" (wide, Unicode). Con las técnicas que se explican en Uso de tipos de datos genéricos, también puede escribir este ejemplo para usar tipos de datos genéricos, de modo que se pueda compilar para usar páginas de código de Windows o Unicode, dependiendo de si se define "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);

En el ejemplo siguiente se muestra la diferencia entre controlar el mensaje WM_CHAR en un procedimiento de ventana de página de códigos de Windows y un procedimiento de ventana 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 el texto de los mensajes recibidos por AnsiWndProc se compone de caracteres de página de códigos de Windows. Todo el texto de los mensajes recibidos por UniWndProc se compone de caracteres Unicode.

Usar Unicode y juegos de caracteres