【項目界面】MFC框架程序總體剖析

MFC框架程序剖析

在理解MFC框架之前,首先要明白C++中的繼承、封裝、多態。
多態成立三個條件:
1 子類要繼承父類
2 子類重載父類的虛函數
3 父類指針指向子類對象

MFC框架把main函數封裝在了裏面


WINDOWS程序是與傳統的DOS程序截然不同的兩種程序設計方式,它是由事件驅動的,在應用程序展示給客戶的UI (User In⁃terface 用戶界面)中提供了各式各樣的可視對象,用戶可以根據需要,對這些可視對象進行操作,通過鼠標或者鍵盤的操作,產生了操作系統能感知的事件,在這樣的事件發生之後,操作系統嚮應用程序中的特定對象發送消息,然後這些對象調用相應的函數處理過程來完成用戶所要的需求。
WINDOWS 應用程序是建立在對象的基礎之上的。程序中所包含的所有可以操作的可視化組建本質上也是一個對象,用戶通過鼠標或者鍵盤對這些可視化的組建進行操作,之後消息驅動模式去調用這些組件內部可以使用的方法。用戶通過外部輸入進行操作的同時產生了各種不同類型的事件,這些事件又經過操作系統的分配,被相應的對象進行處理,這就是WINDOWS程序運行的的本質。下圖就是對WINDOWS程序的運行原理的簡要說明。

1 WINDOWS應用程序基本特點

在這裏插入圖片描述
WINDOWS系統的本質是一個消息驅動的操作系統,那麼消息的定義是什麼呢,從以下的幾個方面,可以對消息有一個初步的瞭解。
1)消息組成部分:消息是由兩部分組成的,它們分別是消息的名稱(UINT)和參數(WPARAM,LPARM)。當用戶點擊鼠標或者通過鍵盤輸入信息時,操作系統會捕捉到這一事件,同時發送消息到特定的窗口。例如當用戶通過鍵盤輸入字符“z”的時候,就會有WM_CHAR消息就會被髮送,此時用戶輸入的具體是哪個字符則由WPARAM和LPARAM兩個參數來確定。用戶在使用系統提供的消息的同時也可以根據自己的需要定義消息,以便通過自定義的消息發送和接收數據。
2)消息傳遞的目標:每個消息必須由一個窗口來接收,否則會被系統默認的處理。每個窗口都有一個後臺的消息處理函數,稱之爲窗口過程,它的作用是對傳遞過來的進行整理,處理那些和自己有關的消息,屏蔽掉無關的消息。例如(如果對鼠標左鍵單擊事件進行處理,那麼就必須增加針對WM_LBUTTONDOWN消息的處理函數,同樣如果對鼠標右鍵單擊事件進行處理,那麼就必須增加針對WM_RBUTTONDOWN消息的處理函數,以便處理用戶的需求。
3)未處理的消息:在用戶的操作過程中會產生很過的消息,其中有些消息是需要我們處理的,然後大部分的消息是我們不關心的,這時WINDOWS操作系統就會調用默認的串口過程來處理這些我們未處理的消息。WINDOWS的這種默認處理機制,大大的縮短了程序員的開發時間,我們只要把精力集中在我們關注的消息上就可以,其餘的都可以交給系統默認處理。
4)窗口句柄:窗口句柄類似於C++中的指針,系統通過句柄來識別每個不同的窗口,用戶通過操作觸發事件進而又操作系統轉發消息,這是必須爲每一個窗口分配一個句柄,用來辨明窗口的身份,以便接受消息,保證了每一個消息能夠被相應的窗口接受,之後再調用該窗口的窗口過程處理。如果有兩個窗口,窗口A,窗口B,共用一個窗口過程時,如果在窗口A上單擊了鼠標,怎會通過窗口A的句柄發送給窗口A而不是窗口B。

2 消息傳遞過程

消息到產生之後是如何被相應的窗口過程相應的呢,下面我們來了解一下相應的過程,其中有大致分爲5個步驟:

  1. 用戶通過外部設備進行了輸入或者窗口的狀態發生改變導致了事件的產生。
  2. 操作系統捕捉到這個事件,並把其轉化爲相應的消息,之後放入到消息隊列中等候處理。
  3. 應用程序從消息隊列中接收到這個消息。
  4. 應用程序根據消息中的標識句柄把消息傳遞給相應的窗口,並交由該窗口的窗口過程進行處理。
  5. 窗口過程響應這個消息並進行處理。
    其中第3步和第4步構成了應用程序消息循環的主題。消息循環機制是WINDOWS應用程序中最重要的機制,因爲消息循環機制能夠把用戶的操作和消息的響應結合起來。消息循環機制的主要作用就是從已經消息隊列中找到已經產生的消息,然後根據消息句柄發送給相應的窗口進行處理。如果消息隊列中沒有已經生產的消息,那麼操作系統就允許其他應用程序處理它們的消息。

3 MFC主要類庫分析

Windows操作系統最方便之處就是良好的用戶接口,它爲用戶提供了豐富的圖形化界面,這個圖像化界面的本質就是消息處理機制驅動的,所以說消息處理機制是WINDOWS編程的核心,只有詳細的瞭解了這個機制,才徹底瞭解WINDOWS編程。
VC++編程環境提供了一套MFC AppWizard應用嚮導,可以不用編寫代碼的情況下建立一個簡單的WINDOWS應用程序,下面就以這個簡單的應用程序爲模板,簡單分析一下生成對象之間的關係。
在這裏插入圖片描述
CMyApp類:類CmyApp的對象就代表了一個應用程序應用程序啓動:用戶運行該應用程序時,Windows會自動調用應用程序框架內部WinMain函數,CMyApp類它的父類是MFC中的CWINAPP類。這個類包含了其他CWINAPP類中的構造函數,同時還包含了一個重要的成員函數INITINSTANCE(),在WINDOWS操作系統中同一個程序可以在內存中存在很多的實例,例如我們可以開啓多個QQ應用程序,,函數INITINSTANCE 的作用就是在每一個實例產生的時候,完成一些初始化的工作。
CMainFrame類:類CMainFrame它的父類是MFC 中的CFremeWnd類,所以它也是一個框架窗口。CMainFrame是類CMyview的父類,換句話說CMyview類的對象顯示在主框架窗口的客戶區中。在類CMainFrame中,系統已經從類CFremeWnd 那裏繼承了處理窗口的一般事件的WINDOWS 消息,比如改變窗口的大小,窗口最小化等等的成員函數,因此編程的時候程序員不需要再關心此類消息的處理。當然,如果用戶確實需要多這寫默認的成員函數進行修改的時候,我們也可以在類CMainFrame中添加相應的函數,之後重載就可以了。
CMyView 類與CMyDoc類:CMyView 類和CMyDoc 類是兩個結合在一起的類,下面的框圖可以說明文檔與視窗的關係。
在這裏插入圖片描述
在這個框圖當中,文檔是由文檔模板對象生成的,並由應用程序對象管理,而用戶則是通過與文檔相聯繫的視窗對象來存儲、管理應用程序的數據,用戶與文檔之間的交互則是通過與文檔相關聯的視窗對象來進行的。
在這個框圖結構當中,文檔的產生是由文檔模板對象決定的,生成之後的文檔交由應用程序對象管理,而用戶對數據的更新,刪除,修改等操作都是通過文檔窗口對應的對象來完成的,用戶與文檔之間的交互則是通過與文檔窗口對象的對象來進行的。
在每一個新的文檔生成的時候,MFC總會爲其生成一個框架窗口,並且在這個框架窗口中生成一個用戶的視窗窗口作爲它的子窗口。用戶視窗的作用就是監聽用戶的鼠標,鍵盤等輸入設備的操作,一旦有事件產生,就生成消息並傳遞到消息隊列中,完成消息循環以達到文檔對象處理的目的。

4 windows窗口創建過程

WINDOWS 應用程序分單文檔界面SDI 和多文檔界面MDI 兩種,在單文檔界面中,文檔窗口與主框架窗口是同一概念。而這
時的視窗對象則是顯示在文檔窗口的客戶區當中,此時文檔窗口是主框架窗口,即類CMainFrame 的對象。
在瞭解了WINDOWS程序的運行原理以及MFC程序的四個基本對象之後,我們來一起分析一下WINDOWS窗口程序的創建流程。
1)CXXApp中的全局變量定義(在WinMain()函數之前定義的全局變量)CXXApp theApp;
2)調用CXXApp構造函數(創建一個類,它首先會調用自己的構造函數)CXXApp ::CXXApp(){}
3)進入Winmain函數(_tWinMain爲宏,值爲WinMain)
4)完成初始化工作:包括窗口類註冊、窗口產生、顯示和更新
pThread->InitInstance()
對於MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口註冊與創建、顯示等要反覆調用多次,一次對應一個窗口
① 註冊窗口類
AfxEndDeferRegisterClass ()(相當於SDK裏面的RegisterClass()函數)
②創建窗口
CMainFrame::PreCreateWindow()//反覆調用一次用來修改窗口屬性
CFrameWnd::Create()
③消息循環
PumpMessage()
結合了以上的各個內容,我們對WINDOWS應用程序有了一個基本的理解,在基於WINDOWS開發應用程序的時候MFC框架爲我們提供了快捷有效的編程方式,類似於我們常見的填空題項一樣,MFC框架爲我們提供了應用程序建立所需要的主體代碼,其中包含應用程序外觀框架,應用程序消息處理機制框架等,這樣就大大的加快了程序開發的過程,程序開發者可以主要的精力投入多商業邏輯的開發中,而不是在苦苦的在底層代碼中掙扎,縮短了開發的週期,有效的提高了程序開發的效率。

劉紅, 校雲芳. MFC框架程序剖析[J]. 電腦知識與技術, 2012(12):99-101.

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