找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4432|回復: 0
打印 上一主題 下一主題
收起左側

VC++ MFC學習心得(摘自課程設計報告)

[復制鏈接]
跳轉到指定樓層
樓主
ID:102668 發(fā)表于 2016-1-11 05:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
任何程序都有一個入口函數(shù),我們在學習C語言的時候入口函數(shù)是main函數(shù),學習Win32也是有main函數(shù)的,Win32的入口函數(shù)是_tWinMain(),因為MFC對Win32API進行了封裝,所以在MFC的代碼中我們是找不到_tWinMain()入口函數(shù)的,這增加了我們學習MFC的難度,很多同學都不知道程序是從哪里開始運行的,為了解決這個問題,我通過設置斷點的方式,一步一步跟蹤代碼的執(zhí)行,分析出了MFC整體的運行流程。
首先我使用VisualStudio2010提供的搜索功能搜索_tWinMain(),注意這里搜索的路徑不能是當前工程路徑,當前工程路徑里的文件是找不到的,必須是在安裝目錄里的VC庫里去搜索,如圖11示:
不管MFC怎么進行封裝,它的原理還是和Win32一樣的,所以在庫里里面搜索一定可以找到我們需要的_tWinMain函數(shù),圖13示
可以看到,搜索結果中第一個就是我們要找的函數(shù)。進入這個函數(shù)之后,設置一個斷點,然后調試整個程序,可以看到程序果然運行到斷點處,圖14示
從_tWinMain函數(shù)內部我們發(fā)現(xiàn),里面只有一句代碼:returnAfxWinMain(hInstance,hPrevInstance, lpCmdLine, nCmdShow);也就是說MFC使用AfxWinMain替代了_tWinMain函數(shù),原來的_tWinMain函數(shù)實際上是沒有任何用處的,我們繼續(xù)跟蹤,圖15示
在AfxWinMain內部我們終于看見我們熟悉的InitInstance()函數(shù)了,其中里面的類都是通過繼承和多態(tài)的特性進行工作的,CWinApp繼承CWinThread類,我們新建的類CDemoADOApp繼承CWinApp,任何應用程序只有一個CWinApp類,在CWinThread的成員函數(shù)中有InitInstance、Run、ExitInstance三個主要的函數(shù),且這三個函數(shù)都是虛函數(shù),我們的類CDemoADOApp通過繼承CWinApp類,重寫InitInstance和ExitInstance函數(shù),根據(jù)面向對象的多態(tài)性,當執(zhí)行pThread->InitInstance()這一句代碼時執(zhí)行的函數(shù)不再是CWinThread或CWinApp里的InitInstance,而是CDemoADOApp類的InitInstance,我們通過調試工具進入InitInstance內部,圖16示
可以發(fā)現(xiàn),程序果然跳轉到CDemoADOApp類的InitInstance()里面,在InitInstance()里面我們可以對我們的應用程序做初始化工作,當需要的配置都做好之后,退出InitInstance函數(shù),再次回到AfxWinMain函數(shù),接下來程序就會執(zhí)行Run函數(shù),等待消息響應。圖17示
Win32采用的是消息循環(huán)的機制,通過捕捉應用程序上所有消息,識別之后送到相應的消息處理函數(shù)去處理操作,MFC也是基于這個機制,不過MFC使用的是消息映射與反射,就是將消息與處理函數(shù)通過制定宏建立聯(lián)系,歸根到底也是和Win32原理一樣。
調試跟蹤到這里,程序的整體脈絡也大體清晰了,簡單來講AfxWinMain函數(shù)內部就執(zhí)行三個函數(shù)InitInstance、Run、ExitInstance,InitInstance初始化,Run循環(huán)等待消息并執(zhí)行相應處理程序,ExitInstance在程序結束之后做收尾工作,如釋放資源等。
我認為學習VC++最重要的是弄清楚MFC的運行機制,弄清楚MFC的運行機制之前先要明白Win32又是怎么工作的,只要明白了Win32的工作流程,理解MFC就會變得簡單很多了,至于其它的開發(fā),都是基于這個運行機制,所以調試分析我沒有對其他窗口的實現(xiàn)進行分析,而是著重分析了應用程序的執(zhí)行流程。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表