深度說明VS2003 MFC程序框架
希望我對VS2003 MFC一點經驗能給大家帶來幫助,在這里拿出來和大家分享一下。VS2003 MFC經過長時間的發展,很多用戶都很了解VS2003 MFC了,這里我發表一下個人理解,和大家討論討論。
說明:
1、本文作者在VS2003中跟蹤代碼,此代碼為VS2003中拷貝,使用MFC7。
2、不同框架的MFC程序由所不同,本文以單文檔為例。
3、本文讀者需要有一定的SDK的基礎,不需要太多,至少知道它的基本框架和來龍去脈即可!
4、文章只想起到說明作用,所以代碼會有一些刪除。
學MFC,竟然還不知道MFC的MAIN函數在什么地方?怎么運行的?實在不高明。
看過候捷(JJHOU)老師的《深入淺出MFC》的,對它一定很熟悉。呵呵,本文是獻給沒有看過那本書,但是又很希望學習MFC程序設計的朋友的。(沒有看過那本書的朋友還不趕快去買?)其實本文,主要是對《深入淺出MFC》第六章的一個總結和補充罷了!(本文有該書不同的地方,也有一些筆者自己的見解!)
言歸正傳。
假如你用AppWizard一步一步NEXT下來,然后在CLASSVIEW中去找尋WINMAIN函數,那么你只有失望。MFC最大的特點是什么?封裝!MFC的確封裝的太好了,以至于很多想學習MFC的人都望而卻步。閑話少說,還是繼續我們今天的話題,MAIN函數!實話告訴你吧,即使你搜索所有的MFC生成的文件,都無法發現WINMAIN的字眼,那么它就近在什么地方呢?
我相信你已經想到,MAIN函數應該在主要的應用程序文件中。難道是“您定義的程序名.cpp”這個文件?不錯就是它。再Crtl+F一下,看有沒有我們要找的WINMAIN函數?看來你又要失望了,但是你注意有這樣一句:
是不是很特別,再注意一下那句注釋“TheoneandonlyCMyAppobject”,每個應用程序有且只用一個CMyApp對象。我想你應該想到了,WinMain函數每個程序也只能有一個,那么這個全局對象跟WinMain函數肯定有莫大的關系?沒錯,相信你的直覺。#t#
特別注意:深曉C++細節的人一定知道,全局對象優先于MAIN函數執行的道理。如果你不知道也沒關系,那么我在這里告訴你:“全局對象優先于MIAN函數執行,且構建于棧中,切記,切記!”
現在,我們該深入WinMain運行機制了,確切的說,應該是MFC的機制!
首先,看看MFC的庫文件把,它能給我們帶來許多驚喜。(vc6的相應的目錄是\MicrosoftVisualStudio\VC98\MFC\SRC;VC7相應的目錄是\MicrosoftVisualStudio.NET2003\Vc7\atlmfc\src\mfc)
現在我們就從這個全局下手,開始今天的旅途。此時,系統會執行CMyApp的父類(CWinApp)構造函數,再執行CMyApp的構造函數。(先有老爹,再有兒子!),此時就會調用CWinApp的構造函數。OK,就到這里就可以了,仔細看上面代碼,它已經完成了應用程序線程額的啟動,它給予了我們程序的生命。現在請注意:
這段代碼的意思是,獲得了CMyApp的全局對象的this指針。(此時你肯定要疑問,為什么是CMyApp的指針?this目前是在CWinApp中啊? 對此我的答案是,可是你是由CMyApp的對象引發的CWinApp的構造啊!!)這個指針可非一般的人物,稍后我們的很多工作都要靠它完成。
CWinApp之中的成員變量將因為theApp這個全局對象的誕生而獲得配置和初始值。構造完父類,現在構造子類。可是我們看到,AppWizard給我們的子類里它什么也沒做?是的,這一切都聽從你的安排!