窗口过程支持窗口类。 应用程序可以使用 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 字符组成。
相关主题