Share via


註冊視窗類別

視窗程式支援視窗類別。 您的應用程式可以使用 RegisterClassARegisterClassW來註冊視窗類別。 新的應用程式通常應該使用 RegisterClassW

如果應用程式使用 RegisterClassA註冊視窗類別,則函式會通知作業系統所建立類別的視窗預期有文字或字元參數的訊息使用 Windows (ANSI) 字碼頁 字元集。 使用 RegisterClassW 註冊可讓應用程式要求作業系統將訊息的文字參數傳遞為 UnicodeIsWindowUnicode函式可讓應用程式查詢每個視窗的本質。

下列範例示範如何註冊 Windows 字碼頁視窗類別和 Unicode 視窗類別,以及如何撰寫這兩種案例的視窗程式。 為了本範例的目的,所有函式和結構都會以特定 「A」 (ANSI) 或 「W」 (寬的 Unicode) 資料類型來顯示。 使用 使用泛型資料類型中所述的技術,您也可以撰寫此範例來使用泛型資料類型,以便根據是否已定義 「UNICODE」 來編譯成使用 Windows 字碼頁或 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);

下列範例顯示處理 Windows 字碼頁視窗程式和 Unicode 視窗程式中 WM_CHAR 訊息之間的差異。

// "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所接收之訊息中的所有文字都是由 Unicode 字元所組成。

使用 Unicode 和字元集