MFC程序執(zhí)行過(guò)程_第1頁(yè)
MFC程序執(zhí)行過(guò)程_第2頁(yè)
MFC程序執(zhí)行過(guò)程_第3頁(yè)
MFC程序執(zhí)行過(guò)程_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

很是空閑最近.轉(zhuǎn)載一些東西吧..就當(dāng)是復(fù)習(xí)...再不看看,就忘光了MFC應(yīng)用程序的操作步驟可歸結(jié)為四步:創(chuàng)建應(yīng)用程序?qū)ο髏heApp執(zhí)行MFC提供的WinMain()函數(shù)WinMain()調(diào)用InitInstance()函數(shù),此函數(shù)創(chuàng)建文檔模板,主框架窗口,文檔和視圖WinMain()調(diào)用Run()函數(shù),此函數(shù)執(zhí)行主消息循環(huán),以獲取和分派Windows消息。WinMain()是函數(shù)的入口點(diǎn),該函數(shù)的主要任務(wù)是完成一些初始化的工作和維護(hù)了一個(gè)消息循環(huán)。他們的工作流程如下:入口(WinMainO) >MyRegisterClass() >InitInstance()--->while消息循環(huán)。函數(shù)由入口開(kāi)始執(zhí)行,之后調(diào)用MyRegisterClass()注冊(cè)窗口類(lèi),之后InitInstance()生成并顯示窗口,這樣之后,就完成了一個(gè)窗口的初始化工作了(當(dāng)然,在MyRegisterClass(),InitInstance()中都需要調(diào)用相應(yīng)的API函數(shù)來(lái)具體的實(shí)現(xiàn)),然后就是維護(hù)消息循環(huán),至此,程序的基本結(jié)構(gòu)就差不多建立了。以后程序的運(yùn)作就靠個(gè)消息循環(huán)來(lái)推動(dòng)了.1、創(chuàng)建Applicationobject對(duì)象theApp程序一開(kāi)始生產(chǎn)一個(gè)(且只有一個(gè)[Applicationobject對(duì)象theApp,也即一個(gè)CWinApp對(duì)象,這個(gè)全局對(duì)象一產(chǎn)生,便執(zhí)行其構(gòu)造函數(shù),因?yàn)椴](méi)有定義CMyWinApp構(gòu)造函數(shù),所以即執(zhí)行CWinApp類(lèi)的構(gòu)造函數(shù)。該函數(shù)定義于APPCORE.CPP第75行,你可以自己搜出來(lái)啃一啃,因此,CWinApp之中的成員變量將因?yàn)閠heApp這個(gè)全局對(duì)象的誕生而獲得配置與初值。2、WinMain登場(chǎng)用SDK編程序時(shí),程序的入口點(diǎn)是WinMain函數(shù),而在MFC程序里我們并沒(méi)有看到WinMain函數(shù),哦!?原來(lái)她是被隱藏在MFC代碼里面了。當(dāng)theApp配置完成后,WinMain登場(chǎng),慢!細(xì)看程序,并沒(méi)連到WinMain函數(shù)的代碼啊!這個(gè)我也不知道,MFC早已準(zhǔn)備好并由鏈接器直接加到應(yīng)用程序代碼中了,原來(lái)她在APPMODUL.CPP里面,好,我們就認(rèn)為當(dāng)theApp配置完成后,程序就轉(zhuǎn)到APPMODUL.CPP來(lái)了。那執(zhí)行什么呢?看看下面從APPMODUL.CPP摘出來(lái)的代碼:extern"C"intWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){//callshared/exportedWinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);_tWinMain函數(shù)的“_t”是為了支持Unicode而準(zhǔn)備的一個(gè)宏。_tWinMain函數(shù)返回值是AfxWinMain函數(shù)的返回值,AfxWinMain函數(shù)定義于WINMAIN.CPP第21行,稍加整理,去蕪存菁,就可以看到這個(gè)“程序進(jìn)入點(diǎn)”主要做些什么事:intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){intnReturnCode=-1;CWinApp*pApp=AfxGetApp();AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);pApp->InitApplication();pApp->InitInstance()nReturnCode=pApp->Run();AfxWinTerm();returnnReturnCode;}AfxGetApp()函數(shù)是取得CMyWinApp對(duì)象指針,故上面函數(shù)第6至8行相當(dāng)于調(diào)用:CMyWinApp::InitApplication();CMyWinApp::InitInstance()CMyWinApp::Run();因而導(dǎo)致調(diào)用:CWinApp::InitApplication();//因?yàn)镃MyWinApp并沒(méi)有改寫(xiě)InitApplicationCMyWinApp::InitInstance()//因?yàn)镃MyWinApp改寫(xiě)了InitInstanceCWinApp::Run(); //因?yàn)镃MyWinApp并沒(méi)有改寫(xiě)Run用過(guò)SDK寫(xiě)程序的朋友,現(xiàn)在可能會(huì)發(fā)出會(huì)心的微笑。3、 AfxWinInit——AFX內(nèi)部初始化操作AfxWinInit是繼CWinApp構(gòu)造函數(shù)之后的第一個(gè)操作,主要做的是AFX內(nèi)部初始化操作,該函數(shù)定義于APPINIT.CPP第24行,這里就不掏出來(lái)了,你自己搜出來(lái)啃吧!4、 執(zhí)行CWinApp::InitApplicationAfxWinInit之后的操作是pApp->InitApplication,我們已知道pApp指向CMyWinApp對(duì)象,當(dāng)調(diào)用:pApp->InitApplication();相當(dāng)于調(diào)用:CMyWinApp::InitApplication();但是你要知道,CMyWinApp繼承自CWinApp,而InitApplication又是CWinApp的一個(gè)虛擬函數(shù),我們并沒(méi)有改寫(xiě)它(大部分情況下不需改寫(xiě)它),所以上述操作相當(dāng)于調(diào)用:CWinApp::InitApplication();此函數(shù)定義于APPCORE.CPP第125行,你自己搜出來(lái)看吧!我就不搬出來(lái)了,里面的操作都是MFC為了內(nèi)部管理而做的(其實(shí)我也看不懂,知道有這回事就好了)。5、 執(zhí)行CWinApp::InitInstance繼InitApplication函數(shù)之后,AfxWinMain調(diào)用pApp->InitInstance。當(dāng)程序調(diào)用:pApp->InitInstance();相當(dāng)于調(diào)用:CMyWinApp::InitInstance();但是你要知道,CMyWinApp繼承自CWinApp,而InitInstance又是CWinApp的一個(gè)虛擬函數(shù)。由于我們改寫(xiě)了它,所以上述操作就是調(diào)用我們自己(CMyWinApp)的這個(gè)InitInstance函數(shù)。6、 CFrameWnd::Create產(chǎn)生主窗口(并先注冊(cè)窗口類(lèi))現(xiàn)在已經(jīng)來(lái)到CWinApp::InitInstance了,該函數(shù)先new—個(gè)CMyFrameWnd對(duì)象,從而產(chǎn)生主窗口。在創(chuàng)建CMyFrameWnd對(duì)之前,要先執(zhí)行構(gòu)造函數(shù)CMyFrameWnd::CMyFrameWnd(),該函數(shù)用Create函數(shù)產(chǎn)生窗口:CMyFrameWnd::CMyFrameWnd(){Create(NULL,"HelloMFC",WS_OVERLAPPEDWINDOW,rectDefault,NULL,"MainMenu");}其中Create是CFrameWnd的成員函數(shù),它將產(chǎn)生一個(gè)窗口,用過(guò)SDK編程序的朋友都知道,要?jiǎng)?chuàng)建主窗口時(shí)要先注冊(cè)一個(gè)窗口類(lèi),規(guī)定窗口的屬性等,但,這里使用哪一個(gè)窗口類(lèi)呢?Create函數(shù)第一個(gè)參數(shù)(其它參數(shù)請(qǐng)參考MSDN或《深出淺出MFC》詳解)指定窗口類(lèi)設(shè)為NULL又是什么意思?。恳馑际且訫FC內(nèi)建的空中類(lèi)產(chǎn)生一個(gè)標(biāo)準(zhǔn)的外框窗口,但,我們的程序一般都沒(méi)有注冊(cè)任何窗口類(lèi)呀!噢‘Create函數(shù)在產(chǎn)生窗口之前會(huì)引發(fā)窗口類(lèi)的注冊(cè)操作。讓我們先挖出Create函數(shù)都做了些什么操作,Create函數(shù)定義于WINFRM.CPP的第538行(在此我就不把代碼Copy過(guò)來(lái)了,你自己打開(kāi)出來(lái)看吧),函數(shù)在562/r

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論