窗口类支持窗口过程。您可以使用RegisterClassA or RegisterClassW功能注册一个窗口类。如果您使用RegisterClassA注册窗口类,应用程序会通知系统所创建的类的窗口期望具有文本或字符参数的消息使用ANSI字符集;如果您使用RegisterClassW注册,则应用程序请求系统将消息的文本参数作为Unicode传递。IsWindowUnicode功能可使应用程序查询每个窗口的性质。
以下示例显示如何注册ANSI窗口类和Unicode窗口类以及如何为两种情况编写窗口过程。为了本示例的目的,所有功能和结构都将显示为特定的A或W数据类型。使用使用通用数据类型中介绍的技术,您也可以使用通用数据类型编写此示例,以便可以将其编译为ANSI或Unicode,具体取决于是否定义了UNICODE。
/ *注册一个ANSI窗口类。*/
WNDCLASSA AnsiWndCls;
AnsiWndCls.style = CS_DBLCLKS | CS_PARENTDC;
AnsiWndCls.lpfnWndProc = (WNDPROC)AnsiWndProc;
AnsiWndCls.cbClsExtra = 0;
AnsiWndCls.cbWndExtra = 0;
AnsiWndCls.hInstance = hmodUser;
AnsiWndCls.hIcon = NULL;
AnsiWndCls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_IBEAM);
AnsiWndCls.hbrBackground = NULL;
AnsiWndCls.lpszMenuName = NULL;
AnsiWndCls.lpszClassName = "TestAnsi";
RegisterClassA(&AnsiWndCls);
/ *注册一个Unicode窗口类。*/
WNDCLASSW UnicodeWndCls;
UnicodeWndCls.style = CS_DBLCLKS | CS_PARENTDC;
UnicodeWndCls.lpfnWndProc = (WNDPROC)UniWndProc;
UnicodeWndCls.cbClsExtra = 0;
UnicodeWndCls.cbWndExtra = 0;
UnicodeWndCls.hInstance = hmodUser;
UnicodeWndCls.hIcon = NULL;
UnicodeWndCls.hCursor = LoadCursor(NULL,(LPTSTR)IDC_IBEAM);
UnicodeWndCls.hbrBackground = NULL;
UnicodeWndCls.lpszMenuName = NULL;
UnicodeWndCls.lpszClassName = L"TestUnicode";
RegisterClassW(&UnicodeWndCls);
以下示例显示了在ANSI窗口过程中处理WM_CHAR消息与Unicode窗口过程之间的区别。
/ * ANSI窗口过程* /
LONG AnsiWndProc(HWND hwnd,UINT消息,
WPARAM wParam,LPARAM lParam)
{
/ *调度可以接收的消息。*/
switch(message){
case WM_CHAR:
/*
* wParam - 键的值
* lParam - (本例中未使用)
*/
if(lstrcmpA(“Q”,(LPCSTR)wParam)){
/*.
/*.
/*.
}
else {
./*
/*.
/*.
}
break;
./*
./*处理其他消息* /
./*
}
}
/ * Unicode窗口过程* /
LONG UniWndProc(HWND hwnd,UINT消息,
WPARAM wParam,LPARAM lParam)
{
/ *调度可以接收的消息。*/
switch(message){
case WM_CHAR:
/*
* wParam - 键的值
* lParam - (本例中未使用)
*/
if(lstrcmpW(L“Q”,(LPCWSTR)wParam)){
/*.
/*.
/*.
}
else {
/*.
/* .
/* .
}
break;
/* .
/ *处理其他消息* /
/* .
}
}
AnsiWndProc收到的消息中的所有文本将由ANSI字符组成,UniWndProc接收的消息中的所有文本将由Unicode字符组成。