Udostępnij za pośrednictwem


Rejestrowanie klas okien

Klasa okien jest obsługiwana przez procedurę okna. Aplikacja może zarejestrować klasę okien przy użyciu RegisterClassA lub RegisterClassW. Nowe aplikacje powinny zwykle używać RegisterClassW.

Jeśli aplikacja rejestruje klasę okien przy użyciu RegisterClassA, funkcja informuje system operacyjny, że okna utworzonej klasy oczekują komunikatów z parametrami tekstowymi lub znakowymi, aby używać strony kodowej systemu Windows (ANSI) zestawu znaków. Rejestracja przy użyciu RegisterClassW umożliwia aplikacji zażądanie od systemu operacyjnego przekazania parametrów tekstowych komunikatów jako Unicode. Funkcja IsWindowUnicode umożliwia aplikacji wykonywanie zapytań dotyczących charakteru każdego okna.

W poniższym przykładzie pokazano, jak zarejestrować klasę okien strony kodu systemu Windows i klasę okien Unicode oraz jak napisać procedury okien dla obu przypadków. Na potrzeby tego przykładu wszystkie funkcje i struktury są wyświetlane z określonymi typami danych "A" (ANSI) lub "W" (szeroki, Unicode). Korzystając z technik opisanych w Using Generic Data Types, możesz też napisać ten przykład, aby użyć ogólnych typów danych, aby można było go skompilować w celu użycia stron kodu systemu Windows lub Unicode, w zależności od tego, czy zdefiniowano kod 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);

W poniższym przykładzie pokazano różnicę między obsługą komunikatu WM_CHAR w procedurze okna strony kodu systemu Windows i procedurą okna 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;
}

Cały tekst w wiadomościach odebranych przez AnsiWndProc składa się z znaków strony kodowej systemu Windows. Cały tekst w wiadomościach odebranych przez UniWndProc składa się z znaków Unicode.

używanie zestawów znaków i Unicode