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