【Demo 0025】注冊/反注冊窗體類RegisterClassEx/UnregisterClass
所有窗體在創建前都必須注冊窗體類,只有注冊的窗體類才被系統認知并允許實例化,換句話說通過注冊告訴進程窗體管理器此類窗體的屬性如: 背景色,窗體上的鼠標樣式以及窗體事件處理函數等; 有一些控件類系統自帶了的可以不用注冊即可實例化,在不需要時反注冊掉,以便釋放類占用的內存。
(一) 函數聲明
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. 清除類前必須要消除此類的實例才能成功
from:http://www.cnblogs.com/ztercel/archive/2011/08/15/2139972.html
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成