MFC和Win32技術(shù)應(yīng)用分析
“窗口類”的數(shù)據(jù)結(jié)構(gòu)
“窗口類”是Windows系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),可以把它理解為Windows系統(tǒng)的類型定義,而Windows窗口則是相應(yīng)“窗口類”的實(shí)例。Windows使用一個(gè)結(jié)構(gòu)來描述“窗口類”,其定義如下:
typedef struct _WNDCLASSEX {
UINT cbSize; //該結(jié)構(gòu)的字節(jié)數(shù)
UINT style; //窗口類的風(fēng)格
WNDPROC lpfnWndProc; //窗口過程
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance; //該窗口類的窗口過程所屬的應(yīng)用實(shí)例
HICON hIcon; //該窗口類所用的像標(biāo)
HCURSOR hCursor; //該窗口類所用的光標(biāo)
HBRUSH hbrBackground; //該窗口類所用的背景刷
LPCTSTR lpszMenuName; //該窗口類所用的菜單資源
LPCTSTR lpszClassName; //該窗口類的名稱
HICON hIconSm; //該窗口類所用的小像標(biāo)
} WNDCLASSEX;
從“窗口類”的定義可以看出,它包含了一個(gè)窗口的重要信息,如窗口風(fēng)格、窗口過程、顯示和繪制窗口所需要的信息,等等。關(guān)于窗口過程,將在后面消息映射等有關(guān)章節(jié)作詳細(xì)論述。
Windows系統(tǒng)在初始化時(shí),會(huì)注冊(cè)(Register)一些全局的“窗口類”,例如通用控制窗口類。應(yīng)用程序在創(chuàng)建自己的窗口時(shí),首先必須注冊(cè)自己的窗口類。在MFC環(huán)境下,有幾種方法可以用來注冊(cè)“窗口類”,下面分別予以討論。
調(diào)用AfxRegisterClass注冊(cè)
AfxRegisterClass函數(shù)是MFC全局函數(shù)。AfxRegisterClass的函數(shù)原型:
BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);
參數(shù)lpWndClass是指向WNDCLASS結(jié)構(gòu)的指針,表示一個(gè)“窗口類”。
首先,AfxRegisterClass檢查希望注冊(cè)的“窗口類”是否已經(jīng)注冊(cè),如果是則表示已注冊(cè),返回TRUE,否則,繼續(xù)處理。
接著,調(diào)用::RegisterClass(lpWndClass)注冊(cè)窗口類;
然后,如果當(dāng)前模塊是DLL模塊,則把注冊(cè)“窗口類”的名字加入到模塊狀態(tài)的域m_szUnregisterList中。該域是一個(gè)固定長度的緩沖區(qū),依次存放模塊注冊(cè)的“窗口類”的名字(每個(gè)名字是以“n