注册窗口类

窗口过程支持窗口类。 应用程序可以使用 RegisterClassARegisterClassW 注册窗口类。 新应用程序通常应使用 RegisterClassW

如果应用程序使用 RegisterClassA 注册窗口类,该函数会通知操作系统所创建的类的窗口需要具有文本或字符参数的消息才能使用Windows (ANSI) 代码页字符集。 使用 RegisterClassW 注册允许应用程序请求操作系统将消息的文本参数作为 Unicode 传递。 IsWindowUnicode 函数使应用程序能够查询每个窗口的性质。

以下示例演示如何注册Windows代码页窗口类和 Unicode 窗口类,以及如何为这两种情况编写窗口过程。 对于此示例,所有函数和结构都以特定的“A” (ANSI) 或“W” (宽、Unicode) 数据类型显示。 使用泛型数据类型中介绍的技术,也可以编写此示例以使用泛型数据类型,以便编译它以使用Windows代码页或 Unicode,具体取决于是否定义了“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 和字符集