複製鏈接
請複製以下鏈接發送給好友

MFC

(微軟基礎類庫)

鎖定
MFC(Microsoft Foundation Classes),是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了Windows的API,並且包含一個應用程序框架,以減少應用程序開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。
中文名
微軟基礎類庫
外文名
Microsoft Foundation Classes
開發公司
微軟公司
編譯平台
C++ SDK
編程語言
C++
適用平台
Windows

MFC簡單介紹

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 程序設計。

MFC軟件特點

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++專配的 [1] 
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級單詞一樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,並非每個類的內部的所有函數都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函數記下來,隨時學習,也是很好的突擊方法。

MFC關鍵技術

MFC初始化過程

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

MFCRTTI

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

MFC動態創建

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

MFC永久保存

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

MFC消息映射

消息映射與命令傳遞體現了MFC與SDK的不同。在SDK編程中,沒有消息映射的概念,它有明確的回調函數中,通過一個switch語句去判斷收到了何種消息,然後對這個消息進行處理。所以,在SDK編程中,會發送消息和在回調函數中處理消息就差不多可以寫SDK程序了。
在MFC中,看上去發送消息和處理消息比SDK更簡單、直接,但可惜不直觀。舉個簡單的例子,如果我們想自定義一個消息,SDK是非常簡單直觀的,用一條語句:SendMessage(hwnd,message/*一個大於或等於WM_USER的數字*/,wparam,lparam),之後就可以在回調函數中處理了。但MFC就不同了,因為你通常不直接去改寫窗口的回調函數,所以只能亦步亦趨對照原來的MFC代碼,把消息放到恰當的地方。這確實是一樣很痛苦的勞動。

MFC消息傳遞

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

MFC重要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對話框
CWinApp應用程序類。似於C中的main函數,是程序執行的入口和管理者,負責程序建立、消滅,主窗口和文檔模板的建立。最常用函數InitInstance():初始化。
CGdiObject及子類,用於向設備文本畫圖。它們都需要在使用前選的DC。
CPen筆,畫線。
CBrush刷子,填充。
CFont字體,控制文字輸出的字體。
CBitmap位圖
CPalette調色板
CRgn區域,指定一塊區域可以用於做特殊處理。
CFile文件。最重要的不外是Open(打開),Read(讀入),Write(寫)。
CString字符串。封裝了C中的字符數組,非常實用。
CPoint點,就是(x,y)對。
CRect矩形,就是(left,top,right,bottom)。
CSize大小,就是(cx,cy)對(寬、高)。

MFCMFC類別

CAnimateCtrl 自動化通用控件 afxcmn.h
CArchive afx.h
CArray afxtempl.h
CAsyncMonikerFileActiveX控件中提供對異步標記的支持 afxole.h
CAsyncScoket 封裝Windows Sockets API,參看CSocket afxsock.h
CBitmap afxwin.h
CBrush afxwin.h
CButton 按鈕控件對象 afxwin.h
CByteArray afxcoll.h
CCachedDataPathProperty 允許一個ActiveX控件異步傳輸屬性數據和緩衝內存中的數據,參考CDataPathProperty afxctl.h
CCheckListBox afxwin.h
CClientDC afxwin.h
CCmdTarget 所有能夠接收和響應消息的對象的基類afxwin.h
CCmdUI afxwin.h
CColorDialog 顏色選擇的通用對話框,提供為顯示系統定義的顏色列表 afxdlgs.h
CComboBox 組合框對象 afxwin.h
CComboBoxEx CComboBox類的派生類,用於支持在組合框控件中的圖像列表 afxcmn.h
CCommonDialog afxdlgs.h
CControlBar afxext.h
CCriticalSection afxmt.h
CCtrlView afxwin.h
CDaoDatabase afxdao.h
CDaoException afxdao.h
CDaoQueryDef afxdao.h
CDaoRecordset 代表選自數據源記錄集。CDaoRecordset對象可用於三種格式:表類型記錄集,動態集類型記錄集和快照類型記錄集 afxdao.h
CDaoRecordView 提供表單視圖,以在控件中顯示數據庫記錄。表單視圖是CDaoRecordset對象的一部分。參考CFormViewCRecordView afxdao.h
CDaoTableDef afxdao.h
CDaoWorkspace afxdao.h
CDatabase afxdb.h
CDataExchange afxwin.h
CDataPathProperty 實現一個ActiveX控件屬性,它能夠異步加載其數據。這個類允許ActiveX控件在後台下載屬性數據時被激活 afxctl.h
CDateTimeCtrl 封裝新的日期/時間選取器控件 afxdtctl.h
CDBException afxdb.h
CDBVariant afxdb.h
CDC afxwin.h
CDialog 用於包含控件窗口的對話框對象 afxwin.h
CDialogBar afxext.h
CDocItem afxole.h
CDockState afxadv.h
CDocObjectServer afxdocob.h
CDocTemplate afxwin.h
CDocument 用於管理程序的數據的類 afxwin.h
CDragListBox Windows列表框,允許用户把其中的項拖放到不同的位置 afxcmn.h
CDumpContext afx.h
CDWordArray afxcoll.h
CEdit 用於文本輸入的子窗口控件 afxwin.h
CEditView 提供Windows編緝控件的功能。因為CEditView派生於Cedit,該對象可同文件和文件模板一同使用 afxext.h
CEvent afxmt.h
CException afx.h
CFile afx.h
CFileDialog 通用文件對話框,提供Open和Save As對話框中的功能 afxdlgs.h
CFileFind afx.h
CFont afxwin.h
CFontDialog 通用字體對話框,用於顯示當前已裝入系統的字體列表 afxdlgs.h
CFontHolder afxctl.h
CFormView 包含對話框控件的窗口 afxext.h
CFrameWnd SDI(單窗口界面)框架窗口 afxwin.h
CFtpConnection afxinet.h
CFtpFileFind afxinet.h
CGdiObject afxwin.h
CGopherFile afxinet.h
CGopherFileFind afxinet.h
CGopherLocator afxinet.h
CHeaderCtrl 標題通用控件 afxcmn.h
CHotKeyCtrl 熱鍵通用控件 afxcmn.h
CHtmlStream afxisapi.h
CHtmlView 實現Web Browser控件的視圖類,能夠訪問當地或Web上的HTML文件。 afxhtml.h
CHttpConnection afxinet.h
CHttpFile afxinet.h
CHttpFilter 創建並處理超文傳輸協議過濾器對象,該對象用於過濾用於HTTP請求的服務器通知 afxisapi.h
CHttpFilterContext afxisapi.h
CHttpServer Internet Server API(ISAPI)的包裝類 afxisapi.h
CHttpServerContext afxisapi.h
CImageList afxcmn.h
CInternetConnection afxinet.h
CInternetFile afxinet.h
CIPAddressCtrl IP地址控件。類似於編緝框,該控件接收Internet 協議格式的地址 afxcmn.h
CList afxtempl.h
CListBox 列表框對象 afxwin.h
CListCtrl 列表視通用控件 afxcmn.h
ClistView 簡化CListCtrl的使用,添加了對文件和視圖的支持 afxcview.h
CLongBinary afxdb_.h
CMap afxtempl.h
CMapPtrToPtr afxcoll.h
CMapPtrToWord afxcoll.h
CMapStringToOb afxcoll.h
CMapStringToPtr afxcoll.h
CMapWordToOb afxcoll.h
CMapWordToPtr afxcoll.h
CMDIChildWnd MDI(多文檔界面)子框架窗口 afxwin.h
CMDIFrameWnd afxwin.h
CMemFile afx.h
CMenu afxwin.h
CMetaFileDC afxext.h
CMiniFrameWnd 半高的框架窗口,主要用於浮動工具欄。一個小框架窗口沒有最小化和最大化按鈕,但其他都類似於正常的框架窗口 afxwin.h
CMonikerFile afxole.h
CMonthCalCtrl 月曆控件,用於顯示一個用户可選擇日期的日曆 afxdtctl.h
CMultiLock afxmt.h
CMutex afxmt.h
CObArray afxcoll.h
CObject afx.h
CObList afxcoll.h
COleBusyDialog afxodlgs.h
COleChangeIconDialog afxodlgs.h
COleChangeSourceDialog afxodlgs.h
COleCmdUI afxdocob.h
COleControl afxctl.h
COleConvertDialog afxodlgs.h
COleCurrency afxdisp.h
COleDateTime afxdisp.h
COleDBRecordView afxoledb.h
COleDialog afxodlgs.h
COleDocument 把一個文件看作為CDocItem對象的一個集合。包容器和服務器都需要這個結構,因為它們的文件必須能夠包含OLE項 afxole.h
COleException afxdisp.h
COleInsertDialog afxodlgs.h
COleIPFrameWnd afxole.h
COleLinkingDoc OLE包容器文件的基類,這些文件支持對它們所包含項的鏈接 afxole.h
COleLinksDialog afxodlgs.h
COleObjectFactory afxdisp.h
COlePasteSpecialDialog afxodlgs.h
COlePropertiesDialog afxodlgs.h
COleResizeBar afxole.h
COleSafeArray afxdisp.h
COleServerDoc OLE服務器文件的基類 afxole.h
COleServerItem 為OLE項提供一個服務器界面 afxole.h
COleStreamFile afxole.h
COleTemplateServer afxdisp.h
COleUpdateDialog afxodlgs.h
COleVariant afxdisp.h
CPageSetupDialog afxdlgs.h
CPaintDC afxwin.h
CPalette afxwin.h
CPen afxwin.h
CPoint atltypes.h
CPrintDialog 通用打印對話框,提供Print和Print Setup對話框中的功能 afxdlgs.h
CProgressCtrl 通用進程指示器控件 afxcmn.h
CPropertyPage 代表屬性表單中的一頁 afxdlgs.h
CPropertyPageEx
CPropertySheet 屬性表,也叫做多選項卡對話框。一個屬性表由一個CPropertySheet對象和幾個CPropertyPage對象組成 afxdlgs.h
CPropertySheetEx
CPropExchange afxctl.h
CPtrArray afxcoll.h
CPtrList afxcoll.h
CReBar afxext.h
CReBarCtrl afxcmn.h
CRecentFileList afxadv.h
CRecordset 用於訪問數據庫表或查詢的類 afxdb.h
CRecordView 包含對話框控件的窗口 afxdb.h
CRect atltypes.h
CRectTracker afxext.h
CResourceException afxwin.h
CRgn afxwin.h
CRichEditCntrItem afxrich.h
CRichEditCtrl 用户能夠輸入和編緝文本的窗口,提供字符和程序段格式,以及對嵌入OLE項的支持 afxcmn.h
CRichEditDoc afxrich.h
CRichEditView afxrich.h
CScrollBar 滾動條對象 afxwin.h
CScrollView 可滾動的窗口,派生於CView afxwin.h
CSemaphore afxmt.h
CSharedFile afxadv.h
CSingleLock afxmt.h
CSize atltypes.h
CSliderCtrl 提供包含一個滑塊和可選的刻度線的窗口 afxcmn.h
CSocket Windows Socket API的包裝類 afxsock.h
CSocketFile afxsock.h
CSpinButtonCtrl 提供箭頭按鈕,用户可單擊它,以增加或減少某個控件中的一個值 afxcmn.h
CSplitterWnd afxext.h
CStatic 用於標識另一個控件或給用户提供消息的簡單文本框 afxwin.h
CStatusBar afxext.h
CStatusBarCtrl 提供一個層次窗口,通常放於父窗口的底部,用於顯示關於應用程序的狀態信息 afxcmn.h
CStdioFile afx.h
CString afx.h
CStringArray afxcoll.h
CStringList afxcoll.h
CSyncObject afxmt.h
CTabCtrl 允許應用程序在一個窗口或對話框的同一區域顯示多個頁面 afxcmn.h
CTime afx.h
CTimeSpan afx.h
CToolBar afxext.h
CToolBarCtrl 工具欄通用控件 afxcmn.h
CToolTipCtrl 提供工具提示控件的功能,它以一個小彈出窗口的樣子顯示,包含描述某個工具用途的一行文本 afxcmn.h
CTreeCtrl 顯示項的分層結構列表 afxcmn.h
CTreeView 簡化CTreeCtrl的用法 afxcview.h
CTypedPtrArray afxtempl.h
CTypedPtrList afxtempl.h
CTypedPtrMap afxtempl.h
CUIntArray afxcoll.h
CUserException afxwin.h
CView 用於顯示程序數據的類 afxwin.h
CWaitCursor afxwin.h
CWinApp afxwin.h
CWindowDC afxwin.h
CWinThread 代表一個應用程序中的一個線程 afxwin.h
CWnd afxwin.h
CWordArray afxcoll.h

MFCMFC相關

有趣的是,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數據類型

Boolean值(TRUE或FALSE)
BSTR
32-bit字符指針
BYTE
8-bit整數,無符號
COLORREF
32-bit數值,代表顏色值
DWORD
32-bit整數,無符號
LONG
32-bit整數,有符號
LPARAM
32-bit數值,作為窗口函數或callback的參數
LPCSTR
32-bit指針,指向一個常數字符串
LPSTR
32-bit指針,指向一個字符串
LPCTSTR
32-bit指針,指向一個常數字符串,此字符串可以移植到Unicode和DBCS(雙字節字集)
LPTSTR
32-bit指針,指向一個字符串,此字符串可以移植到Unicode和DBCS(雙字節字集)
LPVOID
32-bit指針,指向一個未指定類型的數據
LPRESULT
32-bit數值,作為窗口函數或callback的返回值
UINT
Unsigned int
WNDPROC
32-bit指針,指向一個窗口函數
WORD
16-bit整數,無符號
WPARAM
窗口函數或callback的一個參數

MFC特有類型

POSITION
一個數值,代表collection對象中的元素位置,常用於MFC collection classes
LPCRECT
32-bit指針,指向一個不變的RECT結構

MFC版本更新

MFC
Visual C++
MFC 1.0版
Microsoft C/C++ 7.0版
MFC 2.0 版
MFC 2.5 版
Visual C++1.0版
Visual C++1.5版
MFC 3.0 版
Visual C++2.0版
MFC 3.1版
Visual C++2.1版
MFC 3.2 版
Visual C++2.2版
MFC 4.0版
Visual C++4.0版
MFC 4.1版
Visual C++4.1版
MFC 4.2 版
MFC 4.21版(仍是mfc42.dll)
MFC 6.0版(仍是mfc42.dll)
MFC 7.0版(仍是mfc70.dll)
MFC 7.0版(仍是mfc71.dll)
Visual C++4.2版
Visual C++5.0版
Visual C++6.0版
Visual C++.NET 2002版
Visual C++.NET 2003版
新產品版本 MFC版本
Microsoft C/C++ 7.0 MFC 1.0
Visual C++ 1.0 MFC 2.0
Visual C++ 1.5 MFC 2.5
Visual C++ 2.0 MFC 3.0
Visual C++ 2.1 MFC 3.1
Visual C++ 2.2 MFC 3.2
Visual C++ 4.0 MFC 4.0 (mfc40.dllincluded with Windows 95)
Visual C++ 4.1 MFC 4.1
Visual C++ 4.2 MFC 4.2 (mfc42.dllincluded with the Windows 98 original release)
eMbedded Visual C++ 3.0 MFC 4.2 (mfc42.dll)
Visual C++ 5.0 MFC 4.21 (mfc42.dll)
Visual C++ 6.0 MFC 6.0 (mfc42.dll)
eMbedded Visual C++ 4.0 none
Visual C++ .NET 2002 MFC 7.0 (mfc70.dll)
Visual C++ .NET 2003 MFC 7.1 (mfc71.dll)
Visual C++ 2005 MFC 8.0 (mfc80.dll)
Visual C++ 2008 MFC 9.0.21022 (mfc90.dll)
Visual C++ 2008 with Feature Pack MFC 9.0.30411 (mfc90.dll)
Visual C++ 2010 MFC 10.0 (mfc100.dll)

MFC擴展

每個DLL都有某種類型的接口:變量、指針、函數、客户程序訪問的類。它們的作用是讓客户程序使用DLL,MFC擴展DLL可以有C++的接口。也就是它可以導出C++類給客户端。導出的函數可以使用C++/MFC數據類型做參數或返回值,導出一個類時客户端能創建類對象或者派生這個類。同時,在DLL中也可以使用DLL和MFC [2] 
Visual C++使用的MFC類庫也是保存在一個DLL中,MFC擴展DLL動態連接到MFC代碼庫的DLL,客户程序也必須要動態連接到MFC代碼庫的DLL。(這裏談到的兩個DLL,一個是我們自己編寫的DLL,一個裝MFC類庫的DLL)MFC代碼庫的DLL也存在多個版本,客户程序和擴展DLL都必須使用相同版本的MFC代碼DLL。所以為了讓MFC擴展DLL能很好的工作,擴展DLL和客户程序都必須動態連接到MFC代碼庫DLL。而這個DLL必須在客户程序運行的計算機上。

MFC編程優勢

隨着編程語言的推陳出新,MFC一些缺點日益突出。最重要的就是入門門檻相對其他語言要高,而且同樣完成一個任務代碼量相對較多。而原有的優勢如運行速度快等,也因為其他編程語言的日臻完善和個人電腦運算速度增加而顯得不那麼突出。MFC似乎江河日下。
但是MFC真的沒有任何優勢了嗎?不是,面對底層程序,它能很輕鬆的與Windows API驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕鬆的使用Windows API。這樣造成了一個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是一旦掌握後,開發其他領域的程序或使用第三方軟件時,如工業控制類的程序,由於底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。這就説明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕鬆的語言框架。如果侷限於某一領域的話VC毫無優勢可言,但是如果開發一個新的領域的應用程序或者該程序涉及多個應用領域的話,可減少重複學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。

MFC相關書籍

(1)侯俊傑, 《深入淺出MFC
(2)Ivor Horton著 李頌華 康會光 譯《Visual C++ 2005 入門經典》
(3)Charles Petzold 《windows程序設計》
[3] 
參考資料