Inscription de classes de fenêtre

Une classe window est prise en charge par une procédure de fenêtre. Votre application peut inscrire une classe de fenêtre à l’aide de RegisterClassA ou RegisterClassW. Les nouvelles applications doivent généralement utiliser RegisterClassW.

Si l’application inscrit la classe window à l’aide de RegisterClassA, la fonction informe le système d’exploitation que les fenêtres de la classe créée attendent que les messages avec des paramètres de texte ou de caractère utilisent un jeu de caractères de page de code Windows (ANSI). L’inscription à l’aide de RegisterClassW permet à l’application de demander au système d’exploitation de passer les paramètres de texte des messages en unicode. La fonction IsWindowUnicode permet à une application d’interroger la nature de chaque fenêtre.

L’exemple suivant montre comment inscrire une classe de fenêtre de page de code Windows et une classe de fenêtre Unicode et comment écrire les procédures de fenêtre pour les deux cas. Pour les besoins de cet exemple, toutes les fonctions et structures sont affichées avec les types de données « A » (ANSI) ou « W » (large, Unicode). À l’aide des techniques expliquées dans Utilisation de types de données génériques, vous pouvez également écrire cet exemple pour utiliser des types de données génériques, afin qu’il puisse être compilé pour utiliser des pages de code Windows ou Unicode, selon que « UNICODE » est défini.

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

L’exemple suivant montre la différence entre la gestion du message WM_CHAR dans une procédure de fenêtre de page de code Windows et une procédure de fenêtre 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;
}

Tout le texte des messages reçus par AnsiWndProc est composé de caractères de page de code Windows. Tout le texte des messages reçus par UniWndProc est composé de caractères Unicode.

Utilisation d’Unicode et de jeux de caractères