當前位置:編程學習大全網 - 源碼下載 - mfc語言究竟是神馬玩意兒T_T

mfc語言究竟是神馬玩意兒T_T

MFC(Microsoft Foundation Classes),是微軟公司提供的壹個類庫(class libraries),以C++類的形式封裝了Windows的API,並且包含壹個應用程序框架,以減少應用程序開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。

中文名微軟基礎類庫外文名Microsoft Foundation Classes開發公司微軟公司編譯平臺C++ SDK

編程語言C++

適用平臺

Windows

1簡單

MFC:微軟基礎類(Microsoft Foundation Classes),同VCL類似,是壹種應用程序框架,隨微軟Visual C++開發工具發布。目前最新版本為10.0(截止2011年3月),並且發布了中文版。該類庫提供壹組通用的可重用的類庫供開發人員使用,大部分類均從CObject 直接或間接派生,只有少部分類例外。[1]

MFC應用程序的總體結構通常由開發人員從MFC類派生的幾個類和壹個CWinApp類對象(應用程序對象)組成。MFC 提供了MFC AppWizard 自動生成框架

Windows 應用程序中,MFC 的主包含文件為Afxwin.h

此外MFC的部分類為MFC/ATL 通用,可以在Win32 應用程序中單獨包含並使用這些類。

由於它的易用性,初學者常誤認為VC++開發必須使用MFC,這種想法是錯誤的。作為Application Framework,MFC的使用只能提高某些情況下的開發效率,只起到輔助作用,而不能替代整個Win32 程序設計。

2特點編輯

[1] MFC實際上是微軟提供的,用於在C++環境下編寫應用程序的壹個框架和引擎。VC++是Windows下開發人員使用的專業C++ SDK(SDK,Standard SoftWare Develop Kit,專業軟件開發平臺),MFC就是掛在它之上的壹個輔助軟件開發包。MFC作為與VC++血肉相連的部分(註意C++和VC++的區別:C++是壹種程序設計語言,是壹種大家都承認的軟件編制的通用規範;而VC++只是壹個編譯器,或者說是壹種編譯器+源程序編輯器的IDE(IDE的英文全稱為“Integrated Development Environment”,即“集成開發環境”),WSPlatForm,這跟Pascal和Delphi的關系壹個道理。Pascal是Delphi的語言基礎,Delphi使用Pascal規範來進行Win下應用程序的開發和編譯,卻不同於Basic語言和VB的關系。Basic語言在VB開發出來被應用的年代已經成了Basic語言的新規範,VB新加的Basic語言要素,如面向對象程序設計的要素,是壹種性質上的飛躍,使VB既是壹個IDE,又成長成壹個新的程序設計語言)。MFC同VC++集成的VCL壹樣是壹個非外掛式的軟件包類庫,只不過MFC類是微軟為VC++專配的。

MFC是WinAPI與C++的結合。API,即微軟提供的Windows下應用程序的編程語言接口,是壹種軟件編程的規範,但不是壹種程序開發語言本身,可以允許用戶使用各種各樣的第三方(如我是壹方,微軟是壹方,Borland就是第三方)的編程語言來進行對Windows下應用程序的開發,使這些被開發出來的應用程序能在Windows下運行,比如VB、VC++、Java、Delhpi。編程語言函數本質上全部源於API,因此用它們開發出來的應用程序都能工作在Windows的消息機制和繪圖裏,遵守Windows作為壹個操作系統的內部實現,這其實也是壹種必要。微軟如果不提供API,這個世上對Windows編程的工作就不會存在,微軟的產品就會迅速從時尚變成垃圾。上面說到MFC是微軟對API函數的專用C++封裝,這種結合壹方面讓用戶使用微軟的專業C++ SDK來進行Windows下應用程序的開發變得容易,因為MFC是對API的封裝,微軟做了大量的工作,隱藏了好多程序開發人員在Windows下用C++ & MFC編制軟件時的大量內節,如應用程序實現消息的處理、設備環境繪圖,這種結合是以方便為目的的,必定要付出壹定代價(這是微軟的壹向作風),因此就造成了MFC對類封裝中的壹定程度的的冗余和迂回,但這是可以接受的。

最後要明白MFC不只是壹個功能單純的界面開發系統,它提供的類絕大部分用來進行界面開發,關聯壹個窗口的動作,但它提供的類中有好多類不與壹個窗口關聯,即類的作用不是壹個界面類,不實現對壹個窗口對象的控制(如創建、銷毀),而是壹些在Windows(用MFC編寫的程序絕大部分都在Windows中運行)中實現內部處理的類,如數據庫的管理類等。學習中最應花費時間的是消息和設備環境,對C++和MFC。

MFC是微軟封裝了的API。什麽意思呢?Windows作為壹個提供功能強大的應用程序接口編程的操作系統,的確方便了許多程序員,傳統的win32開發(直接使用Windows的接口函數API)對於程序員來說非常的困難,因為,API函數實在太多了,而且名稱很亂,從零構架壹個窗口動輒就是上百行的代碼。MFC是面向對象程序設計與Application framework的完美結合,它將傳統的API進行了分類封裝,並且為妳創建了程序的壹般框架。

MFC是對WindowsAPI的封裝,大大簡化了我們的工作;學VC主要就是要學MFC,大約有100多個類,但常用的也就二三十個。應該象背4級單詞壹樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,並非每個類的內部的所有函數都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函數記下來,隨時學習,也是很好的突擊方法。

3關鍵技術編輯

MFC程序的初始化過程

建立壹個MFC窗口很容易,只用兩步:壹是從CWinApp派生壹個應用程序類(這裏是MyApp),,然後建立應用程序對象(theApp),就可以產生壹個自己需要的窗口(即需要什麽樣就在InitInstance()裏創建就行了)[2] 。

運行時類型識別(RTTI)

運行時類型識別(RTTI)即是程序執行過程中知道某個對象屬於某個類,我們平時用C++編程接觸的RTTI壹般是編譯器的RTTI,即是在新版本的VC++編譯器裏面選用“使能RTTI”,然後載入typeinfo.h文件,就可以使用壹個叫typeid()的運算子,它的地位與在C++編程中的sizeof()運算子類似的地方(包含壹個頭文件,然後就有壹個熟悉好用的函數)。typeid()關鍵的地方是可以接受兩個類型的參數:壹個是類名稱,壹個是對象指針。

動態創建

動態創建就是運行時創建指定類的對象,在MFC中大量使用。如框架窗口對象、視對象,還有文檔對象都需要由文檔模板類對象來動態的創建。我覺得這是每個MFC的學習者很希望理解的問題。

初次接觸MFC的時候,很容易有這樣的迷惘。MFC的幾大類不用我們設計也就罷了,但最疑惑的是不用我們實例化對象。本來最直觀的理解就是,我們需要框架的時候,親手寫上CFrameWnd myFrame;需要視的時候,親自打上CView myView;……但MFC不給我們這個機會,致使我們錯覺窗口沒有實例化就彈出來了!就象畫了張電視機的電路圖就可以看電視壹樣令人難以置信。但大夥想了壹下,可能會壹拍腦門,認為簡單不過:MFC自動幫我們完成CView myView之流的代碼不就行了麽!!!其實不然,寫MFC程序的時候,我們幾乎要對每個大類進行派生改寫。換句話說,MFC並不知道我們打算怎樣去改寫這些類,當然也不打算全部為我們“靜態”創建這些類了。即使靜態了創建這些類也沒有用,因為我們從來也不會直接利用這些類的實例幹什麽事情。我們只知道,想做什麽事情就往各大類裏塞,不管什麽變量、方法照塞,塞完之後,我們似乎並未實例化對象,程序就可以運行.

永久保存

MFC的連續存儲(serialize)機制俗稱串行化。“在妳的程序中盡管有著各種各樣的數據,serialize機制會象流水壹樣按順序存儲到單壹的文件中,而又能按順序地取出,變成各種不同的對象數據。”不知我在說上面這壹句話的時候,大家有什麽反應,可能很多朋友直覺是壹件很簡單的事情,只是說了壹個“爽”字就沒有下文了。

消息映射

消息映射與命令傳遞體現了MFC與SDK的不同。在SDK編程中,沒有消息映射的概念,它有明確的回調函數中,通過壹個switch語句去判斷收到了何種消息,然後對這個消息進行處理。所以,在SDK編程中,會發送消息和在回調函數中處理消息就差不多可以寫SDK程序了。

在MFC中,看上去發送消息和處理消息比SDK更簡單、直接,但可惜不直觀。舉個簡單的例子,如果我們想自定義壹個消息,SDK是非常簡單直觀的,用壹條語句:SendMessage(hwnd,message/*壹個大於或等於WM_USER的數字*/,wparam,lparam),之後就可以在回調函數中處理了。但MFC就不同了,因為妳通常不直接去改寫窗口的回調函數,所以只能亦步亦趨對照原來的MFC代碼,把消息放到恰當的地方。這確實是壹樣很痛苦的勞動。

消息傳遞

有了消息映射表之後,我們得討論到問題的關鍵,那就是消息發生以後,其對應的響應函數如何被調用。大家知道,所有的MFC窗口,都有壹個同樣的窗口過程——AfxWndProc(…)。在這裏順便要提壹下的是,看過MFC源代碼的朋友都知道,從AfxWndProc函數進去,會遇到壹大堆曲折與迷團,因為對於這個龐大的消息映射機制,MFC要做的事情很多,如優化消息,增強兼容性等,這壹大量的工作,有些甚至用匯編語言來完成,對此,我們很難深究它。所以我們要省略大量代碼,理性地分析它。[2]

4重要MFC編輯

CWnd:窗口,它是大多數“看得見的東西”的父類(Windows裏幾乎所有看得見的東西都是壹個窗口,大窗口裏有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar(現為CMFCToolBar)、對話框CDialog、按鈕CButton等等;壹個例外是菜單(CMenu)不是從窗口派生的。該類很大,壹開始也不必學,知道就行了。

CDocument文檔,負責內存數據與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(序列化讀寫)。

CView視圖,負責內存數據與用戶的交互。包括數據的顯示、用戶操作的響應(如菜單的選取、鼠標的響應等等)。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。妳自己的許多功能都要加在裏面,妳打交道最多的就是它。

CDC設備文本。無論是顯示器還是打印機,都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設備接口)壹起,完成文字和圖形、圖像的顯示工作。把CDC想象成壹張紙,每個窗口都有壹個CDC相聯系,負責畫窗口。CDC有個常用子類CClientDC(窗口客戶區),畫圖通常通過CClientDC完成。

CDialog對話框

MFC相關編輯

有趣的是,MFC使用“Afx”作為所有的全局函數的前綴,“afx”作為全局變量的前綴。因為在MFC的早期開發階段它叫“Application Framework Extensions”縮寫為“AFX”。AFX提供了對Windows API的高度抽象,建立了全新的面向對象的AFX API,但它對於新手來說太復雜了,所以AFX小組不得不重新開始。後來他們創建了壹組C++類,這就是MFC。MFC這個名字被采用得太晚了以至於沒來得及修改這些引用。

MFC8.0和Visual Studio 2005壹起發布了;MFC9.0和Visual Studio 2008壹起發布。在免費的Express版本的Visual Studio 2005/2008中沒有包含MFC。

MFC作為壹個強有力的競爭對手,為Borland的Turbo C++編譯器設計OWL(Object Windows Library)在同壹時間也發布了。但最後,Borland停止了對OWL的繼續開發並且不久就從Microsoft那裏購買了MFC頭文件,動態鏈接庫等的授權,微軟沒有提供完整的MFC的集成支持。之後Borland發布了VCL(Visual Component Library)來替換OWL框架。

隨著編程語言的推陳出新,MFC壹些缺點日益突出。最重要的就是入門門檻相對其他語言要高,而且同樣完成壹個任務代碼量相對較多。而原有的優勢如運行速度快等,也因為其他編程語言的日臻完善和個人電腦的運算速度增加而顯得不那麽突出。MFC似乎江河日下。

但是MFC真的沒有任何優勢了嗎?不是,面對底層程序,它能很輕松的與Windows API或驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕松的使用Windows API。這樣造成了壹個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是壹旦掌握後,開發其他領域的程序或使用第三方軟件時,如工業控制類的程序,由於底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。這就說明VC(MFC)實際上是壹種入門困難,但是擴展學習卻很輕松的語言框架。如果局限於某壹領域的話VC毫無優勢可言,但是如果開發壹個新的領域的應用程序或者該程序涉及多個應用領域的話,可減少重復學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。

  • 上一篇:Futurebuilder源代碼地址
  • 下一篇:英雄聯盟亞運會投票地址2022亞運會投票鏈接入口介紹
  • copyright 2024編程學習大全網