孫鑫VC++視頻學習筆記之2: MFC程序框架的剖析

轉自: 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章