版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、For personal use only in study and research; not for commercial use窗口類的誕生 (注冊自己的窗口類 )一什么是窗口類在 Windows 中運(yùn)行的程序, 大多數(shù)都有一個或幾個可以看得見的窗口, 而在這些窗口被創(chuàng)建起來之前, 操作系統(tǒng)怎么知道該怎樣創(chuàng)建該窗口,以及用戶操作該窗口的各種消息交給誰處理呢?所以 VC 在調(diào) 用 Windows 的 API ( CreateWindow 或者 CreateWindowEx )創(chuàng)建窗口之前,要求程序員必須定義一個 窗口類(不是傳統(tǒng) C+ 意義上的類)來規(guī)定所創(chuàng)建該窗口所需要的各種信息,主要包
2、括:窗口的消息 處理函數(shù)、窗口的風(fēng)格、圖標(biāo)、 鼠標(biāo)、菜單等。其定義如下:typedef struct tagWNDCLASSA( 注:該結(jié)構(gòu)為 ANSII 版本 )UINT style ;WNDPROC lpfnWndProc ;int cbClsExtra ;int cbWndExtra ;HINSTANCE hInstance ;HICON hIcon ;HCURSOR hCursor ;HBRUSH hbrBackground ;LPCSTR lpszMenuName ;LPCSTR lpszClassName ;WNDCLASSA, * PWNDCLASSA, NEAR * NPWND
3、CLASSA, FAR * LPWNDCLASSA ;style 表示該類窗口的風(fēng)格, 如 style = CS_VREDRAW|CS_HREDRAW 表示窗口在運(yùn)動或者調(diào)整大小時 需要重畫,關(guān)于其它風(fēng)格可在 MSDN 中查到。lpfnWndProc 為一指針,指向用戶定義的該窗口的消息處理函數(shù)。cbClsExtra 用于在窗口類結(jié)構(gòu)中保留一定空間,用于存在自己需要的某些信息。cbWndExtra 用于在 Windows 內(nèi)部保存的窗口結(jié)構(gòu)中保留一定空間。hInstance 表示創(chuàng)建該窗口的程序的運(yùn)行實(shí)體代號( WinMain 的參數(shù)之一) 。hIcon、hCursor、hbrBackgrou
4、nd 、lpszMenuName 分別表示該窗口的圖標(biāo)、 鼠標(biāo)形狀、 背景色以及菜單。lpszClassName 表示該窗口類別的名稱,即標(biāo)識該窗口類的標(biāo)志。 從上面可以看出一個窗口類就對應(yīng)一個 WNDCLASSA 結(jié)構(gòu)(這里以 ANSII 為例),當(dāng)程序員將該結(jié)構(gòu)按自己要求填寫完成后,就可以調(diào)用 RegisterClass(或RegisterClassEx)函數(shù)將該類注冊,這樣以后凡是 要創(chuàng)建該窗口,只需要以該類名(IpszClassName中指定)為參數(shù)調(diào)用 CreateWindow,你看多方便呀, 真是一舉多得啊!傳統(tǒng) SDK 中的窗口類既然我們知道了什么是窗口類,那我們就將它放到一個傳
5、統(tǒng)的 SDK 程序中,看看是怎樣運(yùn)行的#includeLRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)static TCHAR szAppName = TEXT ("HelloWin") ;WNDCLAS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.l
6、pfnWndProc = WndProc ;wndclass.lpszClassName = szAppName ;RegisterClass (&wndclass);hwnd = CreateWindow( szAppName,.,NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)TranslateMessage (&msg) ;DispatchMessage (&msg) ;return msg.wParam ;這是一個標(biāo)準(zhǔn)
7、的 Windows 程序代碼,程序被啟動后,填寫一個窗口類,然后調(diào)用RegisterClass 將該類注冊,接著創(chuàng)建該窗口,最后顯示窗口和進(jìn)入消息循環(huán)。三 MFC 中的窗口類當(dāng)你看到這里, 也許你可能會感到奇怪: 我在用 MFC 向?qū)ё龀绦驎r, 并沒有進(jìn)行什么窗口類的填寫和 注冊嗎?是的,你沒有,但是向?qū)湍阕隽恕T谡故鞠驅(qū)窃趺醋龅闹?,請讓我先介紹一下預(yù)先知 識。在 MFC 系統(tǒng)中定義了五個默認(rèn)的窗口類(這里不包括 AFX_WNDCOMMCTLS_REG ) ,分別定義在 AFXIMPL.h 中:#define AFX_WND_REG (0x0001)#define AFX_WNDCONT
8、ROLBAR_REG (0x0002)#define AFX_WNDMDIFRAME_REG (0x0004)#define AFX_WNDFRAMEORVIEW_REG (0x0008)#define AFX_WNDDOLECONTROL_REG (0x0020)在 WINCORE.cpp 定義了這些窗口類對應(yīng)的字符串名稱:const TCHAR _afxWnd = AFX_WND;const TCHAR _afxWndControlBar = AFX_WNDCONTROLBAR;const TCHAR _afxWndMDIFrame = AFX_WNDMDIFRAME;const TCHA
9、R _afxWndFrameOrView = AFX_WNDFRAMEORVIEW;const TCHAR _afxWndOleControl = AFX_WNDOLERONTROL;在 AFXIMPL.h 中定義了五個 AFX_XXX 對應(yīng)的字符串:#define AFX_WND AFX_WNDCLASS“( WND” )#define AFX_WNDCONTROLBAR AFX_WNDCLA“SSC( ontrolBar ”)#define AFX_WNDMDIFRAME AFX_WNDCLAS“S(MDIFrame” )#define AFX_WNDFRAMEORVIEW AFX_WND
10、CLA“SSF(rameOrView ” )#define AFX_WNDOLECONTROL AFX_WNDCLAS“SO( leControl ” )看到這里也許有些心急了, 其實(shí)上面一堆代碼只是定義了五個默認(rèn)窗口類的字符串名稱和二進(jìn)制名稱, 具體注冊行為在全局函數(shù) AfxDeferRegisterClass 中。我們現(xiàn)在再來看看 AfxDeferRegisterClass 是什么樣子的:#define AfxDeferRegisterClass(fClass) (afxRegisteredClasses & fClass) ? TRUE:AfxEndDeferRegisterCl
11、ass(fClass) #define afxRegisteredClasses AfxGetModuleState()->m_fRegisteredClasses BOOL AFXAPI AfxEndDeferRegisterClass(short fClass)WNDCLASS wndCls;wndCls.lpfnWndProc = DefWindowProc;if(fClass & AFX_WND_REG)wndCls.lpszClassName=_afxWnd;AfxRegisterClass(&wndCls);else if(fClass & AFX_W
12、NDOLECONTROL_REG)wndCls.lpszClassName=_afxWndOleControl;AfxRegisterClass(&wndCls);else if(fClass & AFX_WNDCONTROLBAR_REG)wndCls.lpszClassName=_afxWndControlBar;AfxRegisterClass(&wndCls);else if(fClass & AFX_WNDMDIFRAME_REG)RegisterWithIcon(&wndCls,_afxWndMDIFrame,AFX_IDI_MDIFRAME
13、);else if(fClass & AFX_WNDFRAMEORVIEW_REG)RegisterWithIcon(&wndCls,_afxWndFrameOrView,AFX_IDI_STD_FRAME);else if(fClass & AFX_WNDCOMMCTLS_REG)InitCommonControls();從上面的代碼可以看出, AfxDeferRegisterClass 函數(shù)首先判斷該窗口類是否注冊, 如已注冊則直接返回, 否 則調(diào)用 AfxEndDeferRegisterClass 進(jìn)行注冊,即注冊要求的默認(rèn)窗口類。其中 RegisterWithI
14、con 和InitCommonControls 最終也是轉(zhuǎn)化為調(diào)用 AfxRegisterClass,而 AfxRegisterClass 函數(shù)調(diào)用 Registerclass 進(jìn)行 注冊,啊,終于看到 SDK中的RegisterClass了,看到它總有一種親切感!有了上面的知識,我們就可以很容易摸清 MFC 是怎樣注冊窗口類的了!我們知道 Windows 上所有看得見 的東西,在MFC中都是繼承于 CWnd類的,而CWnd類創(chuàng)建窗口的成員函數(shù)是 Create和CreateEx,由于Create 最終是調(diào)用CreateEx,所以我們只需要看CreateEx函數(shù)就行了:BOOL CWnd:Cre
15、ateEx(DWORD dwExStyle, LPCSTSTR lpszClassName,LPVOID IpParam)CREATESTRUCT cs;cs.dwExStyle = dwExStyle;cs.lpCreateParams = lpParam;PreCreateWindow(cs);AfxHookWindowCreate(this);HWND hWnd=:CreateWindowEx(cs.dwStyle,cs.lpszClass,,csOpCParams);啊,一看到 CreateWindowEx,親切感又來了,這不是和 SDK中的CreateWindow 樣嘛,是創(chuàng)建窗口!
16、既 然這樣,那么注冊窗口肯定在該函數(shù)之前,會是誰呢?如果你做過一點(diǎn)MFC 程序,你就會對將眼光停留PreCreateWindow 上。對!就是它了。PreCreateWindow函數(shù)是CWnd類的一個虛擬函數(shù),提供程序設(shè)置待創(chuàng)建窗口的屬性(包括窗口類),這樣繼承于 CWnd 的類都可以按照自己的要求在 PreCreateWindow 中設(shè)置自己的屬性了,而且我們看到 MFC 也 是這樣做的:BOOL CWnd:PreCreateWindow(CREATESTRUCT &cs)if(cs.lpszClass = = NULL)AfxDeferRegisterClass(AFX_WND_R
17、EG);cs.lpszClass = _afxWnd;return TRUE;BOOL CFrameWnd:PreCreateWindow(CREATESTRUCT &cs)if(cs.lpszClass = = NULL)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);cs.lpszClass = _afxWndFrameOrView;return TRUE;BOOL CMDIFrameWnd:PreCreateWindow(CREATESTRUCT &cs)if(cs.lpszClass = = NULL)AfxDeferRegi
18、sterClass(AFX_WNDMDIFRAME_REG);cs.lpszClass = _afxWndMDIFrame;BOOL CMDIChildWnd:PreCreateWindow(CREATESTRUCT &cs)return CFrameWnd:PreCreateWindow(cs);BOOL CView:PreCreateWindow(CREATESTRUCT &cs)if(cs.lpszClass = = NULL)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);cs.lpszClass = _afxWndFrameOrView;就是通過繼承的方法, MFC 實(shí)現(xiàn)常用類的窗口注冊(代碼并不完全,是從 MFC 中抽取對我們有意義的一 部分代碼)。四在 MFC 中注冊自己的窗口類在 MFC 中創(chuàng)建一個窗口, 就必須是繼承于 CWnd 類的,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)自我評價15篇
- 個人保證書集錦15篇
- 戰(zhàn)友聚會致辭(15篇)
- 學(xué)生畢業(yè)晚會策劃書12篇
- 四年級下冊語文說課稿錦集六篇
- 客服辭職報告15篇
- 秋季幼兒園中班工作計劃
- 出納的實(shí)習(xí)報告范文錦集10篇
- 晶狀體病-教學(xué)課件
- 健康檢測設(shè)備代理銷售合同(2篇)
- 四年級寒假語文實(shí)踐作業(yè)
- 項目進(jìn)場計劃及臨建方案
- 蒸汽管道設(shè)計表(1)
- 通信設(shè)施產(chǎn)權(quán)歸屬
- 提撈采油安全操作規(guī)程
- 京劇英語介紹PPT課件
- in、ing對比辨音練習(xí).doc
- 關(guān)于廣州番禺龍沙國際港口物流園龍沙碼頭二期工程可行性研
- 酒店管理權(quán)限權(quán)限表——酒店管理人員折扣權(quán)限匯總表2016(葉予舜)
- 北京市海淀區(qū)2021-2022學(xué)年七年級第一學(xué)期期末考試語文試卷[附答案]
- 光刻工藝光刻對準(zhǔn)
評論
0/150
提交評論