所有窗体在创建前都必须注册窗体类,只有注册的窗体类才被系统认知并允许实例化,换句话说通过注册告诉进程窗体管理器此类窗体的属性如: 背景色,窗体上的鼠标样式以及窗体事件处理函数等; 有一些控件类系统自带了的可以不用注册即可实例化,在不需要时反注册掉,以便释放类占用的内存。
(一) 函数声明
I). 类注册
ATOM RegisterClassEx(CONST WNDCLASSEX *lpwcx );
注册一个窗体类,以便通用CreateWindowEx, CreateWindow来实例化一个窗体
ATOM RegisterClass(CONST WNDCLASS *lpWndClass );
与RegisterClassEx功能一样, 仅参数WNDCLASS中不支持iconsm的设置
Code1: 以下代码演示了如何注册一个函数, 必须要设置的参数
1. 类名
2. 窗体过程函数
//////////////////////////////////////////////////////////////////////////
bool
RegisterWndClass
(
HINSTANCE
hInstance
,
const
TCHAR
*
szClsName
)
{
WNDCLASSEX
wcs
= {0};
wcs
.
cbSize
=
sizeof
(
WNDCLASSEX
);
wcs
.
hbrBackground
= (
HBRUSH
)
GetStockObject
(
COLOR_APPWORKSPACE
);
wcs
.
lpszClassName
=
szClsName
;
wcs
.
lpfnWndProc
=
WndProc
;
wcs
.
hCursor
=
LoadCursor
(
NULL
,
MAKEINTRESOURCE
(
IDC_ARROW
));
wcs
.
hIcon
=
LoadIcon
(
hInstance
,
MAKEINTRESOURCE
(
IDI_APPLICATION
));
wcs
.
style
=
CS_VREDRAW
|
CS_HREDRAW
;
return
(0 !=
RegisterClassEx
(&
wcs
));
}
II). 类反注册
BOOL UnregisterClass(LPCTSTR lpClassName, HINSTANCE hInstance);
从进程中清除己注册的类,并释放类占用的内存,
Code2. 以下代码演示了反注册现有类
if
(
WM_QUIT
==
Msg
.
message
)
{
if
(
UnregisterClass
(
gszClsName
,
ghInstance
))
{
TCHAR
szInfo
[256];
_stprintf
(
szInfo
,
_T
(
"Destroy [%s] window class"
),
gszClsName
);
OutputDebugString
(
szInfo
);
}
return
;
}
注: 因为只有一个窗体在注册类之必须确保消除了此类的实例
(二) 特别说明
1. 注册后的类与C++中的类意义是一样的, 他们有着共同的属性,同样的类名, 同样的窗体处理函数以及背景色
2. 同一个类在一个进程中只有注册一次(除非反注册后),若类己存在时再注册会返回失败
3. 清除类前必须要消除此类的实例才能成功
演示代码