在Windows中,每个应用程序都必须注册自己的窗口类。您的应用程序可以随时使用RegisterClassEx功能注册应用程序本地类。您必须在应用程序中定义窗口过程,填写WNDCLASSEX结构的成员,然后将一个指向结构的指针传递给RegisterClassEx函数。
以下示例显示如何注册本地窗口类并使用它来创建应用程序的主窗口。
#include < windows.h >
//全局变量
HINSTANCE hinst;
//函数原型。
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
InitApplication(HINSTANCE);
InitInstance(HINSTANCE, int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
//应用入口点
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
if(!InitApplication(hinstance))
return FALSE;
if(!InitInstance(hinstance,nCmdShow))
return FALSE;
while(GetMessage(& msg,(HWND)NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
UNREFERENCED_PARAMETER(lpCmdLine);
}
BOOL InitApplication(HINSTANCE hinstance)
{
WNDCLASSEX wcx;
//使用参数填写窗口类结构
//描述主窗口。
wcx.cbSize = sizeof(wcx); //结构大小
wcx.style = CS_HREDRAW |
CS_VREDRAW; //如果大小更改,重绘
wcx.lpfnWndProc = MainWndProc; //指向窗口过程
wcx.cbClsExtra = 0; //没有额外的类内存
wcx.cbWndExtra = 0; //没有额外的窗口记忆
wcx.hInstance = hinstance; //实例的句柄
wcx.hIcon = LoadIcon(NULL,
IDI_APPLICATION); //预定义的应用程序图标
wcx.hCursor = LoadCursor(NULL,
IDC_ARROW); //预定义的箭头
wcx.hbrBackground = GetStockObject(
WHITE_BRUSH); //白色背景画笔
wcx.lpszMenuName = "MainMenu"; //菜单资源的名称
wcx.lpszClassName = "MainWClass"; //窗口类的名称
wcx.hIconSm = LoadImage(hinstance, //小班图标
MAKEINTRESOURCE(5),
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
LR_DEFAULTCOLOR);
//注册窗口类。
return RegisterClassEx(&wcx);
}
BOOL InitInstance(HINSTANCE hinstance, int nCmdShow)
{
HWND hwnd;
//保存应用程序实例句柄。
hinst = hinstance;
//创建主窗口。
hwnd = CreateWindow(
"MainWClass", //窗口类的名称
"Sample", // top-level window
WS_OVERLAPPEDWINDOW, //顶级窗口
CW_USEDEFAULT, //默认水平位置
CW_USEDEFAULT, //默认垂直位置
CW_USEDEFAULT, //默认宽度
CW_USEDEFAULT, //默认高度
(HWND) NULL, //没有所有者窗口
(HMENU) NULL, //使用类菜单
hinstance, //应用程序实例的句柄
(LPVOID) NULL); //没有窗口创建数据
如果(!hwnd)
return FALSE;
//显示窗口并发送WM_PAINT消息到窗口
//程序。
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
return TRUE;
}
注册应用程序全局类与注册应用程序本地类类似,但有以下例外:
* WNDCLASSEX结构的样式参数必须指定CS_GLOBALCLASS样式。
*该类可以由应用程序或DLL注册。如果由应用程序注册,则该类仅在应用程序中是全局的。如果类由注册表注册并列在注册表中,系统会为每个应用程序加载DLL。
*注册该类之前,应用程序或DLL不需要检查应用程序或DLL的上一个实例。