注册窗口类

窗口过程支持窗口类。 应用程序可以使用 RegisterClassA 或 RegisterClassW 注册窗口 。 新应用程序通常应使用 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 代码页窗口过程中处理 WM_CHAR 消息与 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;
}

AnsiWndProc 接收的消息中的所有文本都由 Windows 代码页字符组成。 UniWndProc 接收的消息中的所有文本都由 Unicode 字符组成。

使用 Unicode 和字符集