轉自: http://webbery.tianyablog.com
說明:本課對應教學視頻的第三課,第二課是C++,被我跳過去。C++我打算另外在用多點的篇幅來討論。
重點:MFC運行機制
提示:對於不想理解內部運行過程的,可以不看這一章,可以看了後面的界面設計再回頭來看這一章,可能感覺更深刻。
這一次課和上一次的課的重點就是MFC的窗口類創建過程,而要反覆說明的就是:MFC的程序和C語言的程序,從執行原理上說,是完全一致的。
抓住這一點,那麼對於理解MFC程序的運行機制也就相對於簡單了。
C中的main函數就相當於MFC中的WinMain函數。
感興趣的可以利用VC的斷點設置自己跟蹤下面講述的各個函數,就明白它的執行順序了。
一、C語言程序執行步驟
在C語言中,大約的步驟如下:
1, 全局變量內存分配
2, 進入main函數
二、MFC程序的運行步驟(主要是初始化)
打開一個MFC APPWizard(exe)工程,跟蹤其執行步驟,可以發現,是以下順序:
1) CXXApp中的全局變量定義
CXXApp theApp;
2) 調用CXXApp構造函數
CXXApp ::CXXApp(){}
3) 進入Winmain函數(_tWinMain爲宏,值爲WinMain)
_tWinMain(){}
4) 完成初始化工作:包括窗口類註冊、窗口產生、顯示和更新
pThread->InitInstance()
對於MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口註冊與創建、顯示等要反覆調用多次,一次對應一個窗口
(1) 註冊窗口類
AfxEndDeferRegisterClass
(2) 創建窗口
CMainFrame::PreCreateWindow()//反覆調用一次是給我們修改窗口屬性的機會
CFrameWnd::Create()
(3) 消息循環
PumpMessage()
補充1:
在MFC中,由於涉及到(窗口)類定義,所以定義全局變量的時候,需要進行更多的步驟。
全局變量涉及到類定義(類似於C中的類型定義)的話,那麼需要遵循以下步驟(以MFC的窗口類爲例)
1) 設計一個窗口類
2) 註冊窗口類
3) 創建窗口
4) 顯示及更新窗口
5) 消息循環
補充2:其他需要注意的幾點
1,
每一個MFC程序,有且只有一個從WinApp類派生的類(應用程序類),也只有一個從應用程序類所事例化的對象,表示應用程序本身。在WIN32程序當
中,表示應用程序是通過WINMAIN入口函數來表示的(通過一個應用程序的一個事例號這一個標識來表示的)。在基於MFC應用程序中,是通過產生一個應
用程序對象,用它來唯一的表示了應用程序。
2,
_tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程
序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)。
3, 設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數註冊所選擇的窗口類。
4, PreCreateWindow()是個虛函數,如果子類有則調用子類的。
5,
CreateWindowEx()函數參數與CREATESTRUCT結構體成員完全一致,CreateWindowEx()函數與
CREATESTRUCT結構體參數的對應關係,使我們在創建窗口之前通過可PreCreateWindow(cs)修改cs結構體成員來修改所要的窗口
外觀。
6,注意兩個函數。
::TranslateMessage(&m_msgCur)函數進行消息(如鍵盤消息)轉換
::DispatchMessage(&m_msgCur)函數分派消息到窗口的回調函數處理(實際上分派的消息經過消息映射,交由消息響應函數進行處理。)
7,可以認爲View類窗口是CMainFram類窗口的子窗口。DOCument類是文檔類。DOC-VIEW結構將數據本身與它的顯示分離開。
文檔類用於數據的存儲,加載;視類用於數據的顯示,修改
8,CTEApp::InitInstance()函數中通過文檔模板將文檔類,視類,框架類的有機組織一起。語句如下:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTEDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTEView));
AddDocTemplate(pDocTemplate);//增加到模板
補充3:本課涉及到MFC函數的源文件位置
根目錄
找到您安裝VC98下MFC的位置,比如我的機子上爲:D:/Program Files/Microsoft Visual Studio/VC98/MFC。下面提供的就是相對路徑了。
CWinApp構造函數: MFC=>SRC=>APPCORE.CPP
AfxWinMain:MFC=>SRC=>WINMAIN.CPP
AfxEndDeferRegisterClass: MFC=>SRC=>APPCORE.CPP
CFrameWnd::PreCreateWindow()函數所在文件:MFC=>SRC=>WINFRM.CPP
CFrameWnd::Create()函數路徑:MFC=>SRC=>WINFRM.CPP
CWnd::CreateEx()函數路徑:MFC=>SRC=>WINCORE.CPP
CWinThread::Run()方法路徑:MFC=>SRC=>THRDCORE.CPP