簡單介紹
MFC:微軟基礎類(MicrosoftFoundationClasses),同VCL類似,是一種應用程式框架,隨微軟VisualC++開發工具發布。目前最新版本為10.0(截止2011年3月),並且發布了中文版。該類庫提供一組通用的可重用的類庫供開發人員使用,大部分類均從CObject直接或間接派生,只有少部分類例外。MFC應用程式的總體結構通常由開發人員從MFC類派生的幾個類和一個CWinApp類對象(應用程式對象)組成。MFC提供了MFCAppWizard自動生成框架Windows應用程式中,MFC的主包含檔案為Afxwin.h。
此外MFC的部分類為MFC/ATL通用,可以在Win32應用程式中單獨包含並使用這些類。
由於它的易用性,初學者常誤認為VC++開發必須使用MFC,這種想法是錯誤的。作為ApplicationFramework,MFC的使用只能提高某些情況下的開發效率,只起到輔助作用,而不能替代整個Win32程式設計。
特點
MFC實際上是微軟提供的,用於在C++環境下編寫應用程式的一個框架和引擎。VC++是Windows下開發人員使用的專業C++SDK(SDK,StandardSoftWareDevelopKit,專業軟體開發平台),MFC就是掛在它之上的一個輔助軟體開發包。MFC作為與VC++血肉相連的部分(注意C++和VC++的區別:C++是一種程式設計語言,是一種大家都承認的軟體編制的通用規範;而VC++只是一個編譯器,或者說是一種編譯器+源程式編輯器的IDE(IDE的英文全稱為“IntegratedDevelopmentEnvironment”,即“集成開發環境”),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是面向對象程式設計與Applicationframework的完美結合,它將傳統的API進行了分類封裝,並且為你創建了程式的一般框架。
MFC是對WindowsAPI的封裝,大大簡化了我們的工作;學VC主要就是要學MFC,大約有100多個類,但常用的也就二三十個。應該象背4級單詞一樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,並非每個類的內部的所有函式都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函式記下來,隨時學習,也是很好的突擊方法。
關鍵技術
MFC程式的初始化過程
建立一個MFC視窗很容易,只用兩步:一是從CWinApp派生一個應用程式類(這裡是MyApp),,然後建立應用程式對象(theApp),就可以產生一個自己需要的視窗(即需要什麼樣就在InitInstance()里創建就行了)。運行時類型識別(RTTI)
運行時類型識別(RTTI)即是程式執行過程中知道某個對象屬於某個類,我們平時用C++編程接觸的RTTI一般是編譯器的RTTI,即是在新版本的VC++編譯器裡面選用“使能RTTI”,然後載入typeinfo.h檔案,就可以使用一個叫typeid()的運運算元,它的地位與在C++編程中的sizeof()運運算元類似的地方(包含一個頭檔案,然後就有一個熟悉好用的函式)。typeid()關鍵的地方是可以接受兩個類型的參數:一個是類名稱,一個是對象指針。動態創建
動態創建就是運行時創建指定類的對象,在MFC中大量使用。如框架視窗對象、視對象,還有文檔對象都需要由文檔模板類對象來動態的創建。我覺得這是每個MFC的學習者很希望理解的問題。初次接觸MFC的時候,很容易有這樣的迷惘。MFC的幾大類不用我們設計也就罷了,但最疑惑的是不用我們實例化對象。本來最直觀的理解就是,我們需要框架的時候,親手寫上CFrameWndmyFrame;需要視的時候,親自打上CViewmyView;……但MFC不給我們這個機會,致使我們錯覺視窗沒有實例化就彈出來了!就象畫了張電視機的電路圖就可以看電視一樣令人難以置信。但大夥想了一下,可能會一拍腦門,認為簡單不過:MFC自動幫我們完成CViewmyView之流的代碼不就行了么!!!其實不然,寫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要做的事情很多,如最佳化訊息,增強兼容性等,這一大量的工作,有些甚至用彙編語言來完成,對此,我們很難深究它。所以我們要省略大量代碼,理性地分析它。重要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)對(寬、高)。
MFC類別
CAnimateCtrl自動化通用控制項afxcmn.hCArchiveafx.h
CArchiveExceptionafx.h
CArrayafxtempl.h
CAsyncMonikerFile在ActiveX控制項中提供對異步標記的支持afxole.h
CAsyncScoket封裝WindowsSocketsAPI,參看CSocketafxsock.h
CBitmapafxwin.h
CBitmapButtonafxext.h
CBrushafxwin.h
CButton按鈕控制項對象afxwin.h
CByteArrayafxcoll.h
CCachedDataPathProperty允許一個ActiveX控制項異步傳輸屬性數據和緩衝記憶體中的數據,參考CDataPathPropertyafxctl.h
CCheckListBoxafxwin.h
CClientDCafxwin.h
CCmdTarget所有能夠接收和回響訊息的對象的基類afxwin.h
CCmdUIafxwin.h
CColorDialog顏色選擇的通用對話框,提供為顯示系統定義的顏色列表afxdlgs.h
CComboBox組合框對象afxwin.h
CComboBoxExCComboBox類的派生類,用於支持在組合框控制項中的圖像列表afxcmn.h
CCommandLineInfoafxwin.h
CCommonDialogafxdlgs.h
CConnectionPointafxdisp.h
CControlBarafxext.h
CCreateContextafxext.h
CCriticalSectionafxmt.h
CCtrlViewafxwin.h
CDaoDatabaseafxdao.h
CDaoExceptionafxdao.h
CDaoFieldExchangeafxdao.h
CDaoQueryDefafxdao.h
CDaoRecordset代表選自數據源的記錄集。CDaoRecordset對象可用於三種格式:表類型記錄集,動態集類型記錄集和快照類型記錄集afxdao.h
CDaoRecordView提供表單視圖,以在控制項中顯示資料庫記錄。表單視圖是CDaoRecordset對象的一部分。參考CFormView和CRecordViewafxdao.h
CDaoTableDefafxdao.h
CDaoWorkspaceafxdao.h
CDatabaseafxdb.h
CDataExchangeafxwin.h
CDataPathProperty實現一個ActiveX控制項屬性,它能夠異步載入其數據。這個類允許ActiveX控制項在後台下載屬性數據時被激活afxctl.h
CDateTimeCtrl封裝新的日期/時間選取器控制項afxdtctl.h
CDBExceptionafxdb.h
CDBVariantafxdb.h
CDCafxwin.h
CDialog用於包含控制項視窗的對話框對象afxwin.h
CDialogBarafxext.h
CDocItemafxole.h
CDockStateafxadv.h
CDocObjectServerafxdocob.h
CDocObjectServerItemafxdocob.h
CDocTemplateafxwin.h
CDocument用於管理程式的數據的類afxwin.h
CDragListBoxWindows列表框,允許用戶把其中的項拖放到不同的位置afxcmn.h
CDumpContextafx.h
CDWordArrayafxcoll.h
CEdit用於文本輸入的子視窗控制項afxwin.h
CEditView提供Windows編緝控制項的功能。因為CEditView派生於Cedit,該對象可同檔案和檔案模板一同使用afxext.h
CEventafxmt.h
CExceptionafx.h
CFieldExchangeafxdb.h
CFileafx.h
CFileDialog通用檔案對話框,提供Open和SaveAs對話框中的功能afxdlgs.h
CFileExceptionafx.h
CFileFindafx.h
CFindReplaceDialogafxdlgs.h
CFontafxwin.h
CFontDialog通用字型對話框,用於顯示當前已裝入系統的字型列表afxdlgs.h
CFontHolderafxctl.h
CFormView包含對話框控制項的視窗afxext.h
CFrameWndSDI(單視窗界面)框架視窗afxwin.h
CFtpConnectionafxinet.h
CFtpFileFindafxinet.h
CGdiObjectafxwin.h
CGopherConnectionafxinet.h
CGopherFileafxinet.h
CGopherFileFindafxinet.h
CGopherLocatorafxinet.h
CHeaderCtrl標題通用控制項afxcmn.h
CHotKeyCtrl熱鍵通用控制項afxcmn.h
CHtmlStreamafxisapi.h
CHtmlView實現WebBrowser控制項的視圖類,能夠訪問當地或Web上的HTML檔案。afxhtml.h
CHttpConnectionafxinet.h
CHttpFileafxinet.h
CHttpFilter創建並處理超文傳輸協定過濾器對象,該對象用於過濾用於HTTP請求的伺服器通知afxisapi.h
CHttpFilterContextafxisapi.h
CHttpServerInternetServerAPI(ISAPI)的包裝類afxisapi.h
CHttpServerContextafxisapi.h
CImageListafxcmn.h
CInternetConnectionafxinet.h
CInternetExceptionafxinet.h
CInternetFileafxinet.h
CInternetSessionafxinet.h
CIPAddressCtrlIP位址控制項。類似於編緝框,該控制項接收Internet協定格式的地址afxcmn.h
CListafxtempl.h
CListBox列表框對象afxwin.h
CListCtrl列表視通用控制項afxcmn.h
ClistView簡化CListCtrl的使用,添加了對檔案和視圖的支持afxcview.h
CLongBinaryafxdb_.h
CMapafxtempl.h
CMapPtrToPtrafxcoll.h
CMapPtrToWordafxcoll.h
CMapStringToObafxcoll.h
CMapStringToPtrafxcoll.h
CMapStringToStringafxcoll.h
CMapWordToObafxcoll.h
CMapWordToPtrafxcoll.h
CMDIChildWndMDI(多文檔界面)子框架視窗afxwin.h
CMDIFrameWndafxwin.h
CMemFileafx.h
CMemoryExceptionafx.h
CMemoryState
CMenuafxwin.h
CMetaFileDCafxext.h
CMiniFrameWnd半高的框架視窗,主要用於浮動工具列。一個小框架視窗沒有最小化和最大化按鈕,但其他都類似於正常的框架視窗afxwin.h
CMonikerFileafxole.h
CMonthCalCtrl月曆控制項,用於顯示一個用戶可選擇日期的日曆afxdtctl.h
CMultiDocTemplateafxwin.h
CMultiLockafxmt.h
CMutexafxmt.h
CNotSupportedExceptionafx.h
CObArrayafxcoll.h
CObjectafx.h
CObListafxcoll.h
COleBusyDialogafxodlgs.h
COleChangeIconDialogafxodlgs.h
COleChangeSourceDialogafxodlgs.h
COleClientItemafxole.h
COleCmdUIafxdocob.h
COleControlafxctl.h
COleControlModuleafxctl.h
COleConvertDialogafxodlgs.h
COleCurrencyafxdisp.h
COleDataObjectafxole.h
COleDataSourceafxole.h
COleDateTimeafxdisp.h
COleDateTimeSpanafxdisp.h
COleDBRecordViewafxoledb.h
COleDialogafxodlgs.h
COleDispatchDriverafxdisp.h
COleDispatchExceptionafxdisp.h
COleDocObjectItemafxole.h
COleDocument把一個檔案看作為CDocItem對象的一個集合。包容器和伺服器都需要這個結構,因為它們的檔案必須能夠包含OLE項afxole.h
COleDropSourceafxole.h
COleDropTargetafxole.h
COleExceptionafxdisp.h
COleInsertDialogafxodlgs.h
COleIPFrameWndafxole.h
COleLinkingDocOLE包容器檔案的基類,這些檔案支持對它們所包含項的連結afxole.h
COleLinksDialogafxodlgs.h
COleMessageFilterafxole.h
COleObjectFactoryafxdisp.h
COlePasteSpecialDialogafxodlgs.h
COlePropertiesDialogafxodlgs.h
COlePropertyPageafxctl.h
COleResizeBarafxole.h
COleSafeArrayafxdisp.h
COleServerDocOLE伺服器檔案的基類afxole.h
COleServerItem為OLE項提供一個伺服器界面afxole.h
COleStreamFileafxole.h
COleTemplateServerafxdisp.h
COleUpdateDialogafxodlgs.h
COleVariantafxdisp.h
CPageSetupDialogafxdlgs.h
CPaintDCafxwin.h
CPaletteafxwin.h
CPenafxwin.h
CPictureHolderafxctl.h
CPointatltypes.h
CPrintDialog通用列印對話框,提供Print和PrintSetup對話框中的功能afxdlgs.h
CPrintInfo
CProgressCtrl通用進程指示器控制項afxcmn.h
CPropertyPage代表屬性表單中的一頁afxdlgs.h
CPropertyPageEx
CPropertySheet屬性表,也叫做多選項卡對話框。一個屬性表由一個CPropertySheet對象和幾個CPropertyPage對象組成afxdlgs.h
CPropertySheetEx
CPropExchangeafxctl.h
CPtrArrayafxcoll.h
CPtrListafxcoll.h
CReBarafxext.h
CReBarCtrlafxcmn.h
CRecentFileListafxadv.h
CRecordset用於訪問資料庫表或查詢的類afxdb.h
CRecordView包含對話框控制項的視窗afxdb.h
CRectatltypes.h
CRectTrackerafxext.h
CResourceExceptionafxwin.h
CRgnafxwin.h
CRichEditCntrItemafxrich.h
CRichEditCtrl用戶能夠輸入和編緝文本的視窗,提供字元和程式段格式,以及對嵌入OLE項的支持afxcmn.h
CRichEditDocafxrich.h
CRichEditViewafxrich.h
CRuntimeClass
CScrollBar滾動條對象afxwin.h
CScrollView可滾動的視窗,派生於CViewafxwin.h
CSemaphoreafxmt.h
CSharedFileafxadv.h
CSingleDocTemplateafxwin.h
CSingleLockafxmt.h
CSizeatltypes.h
CSliderCtrl提供包含一個滑塊和可選的刻度線的視窗afxcmn.h
CSocketWindowsSocketAPI的包裝類afxsock.h
CSocketFileafxsock.h
CSpinButtonCtrl提供箭頭按鈕,用戶可單擊它,以增加或減少某個控制項中的一個值afxcmn.h
CSplitterWndafxext.h
CStatic用於標識另一個控制項或給用戶提供訊息的簡單文本框afxwin.h
CStatusBarafxext.h
CStatusBarCtrl提供一個層次視窗,通常放於父視窗的底部,用於顯示關於應用程式的狀態信息afxcmn.h
CStdioFileafx.h
CStringafx.h
CStringArrayafxcoll.h
CStringListafxcoll.h
CSyncObjectafxmt.h
CTabCtrl允許應用程式在一個視窗或對話框的同一區域顯示多個頁面afxcmn.h
CTimeafx.h
CTimeSpanafx.h
CToolBarafxext.h
CToolBarCtrl工具列通用控制項afxcmn.h
CToolTipCtrl提供工具提示控制項的功能,它以一個小彈出視窗的樣子顯示,包含描述某個工具用途的一行文本afxcmn.h
CTreeCtrl顯示項的分層結構列表afxcmn.h
CTreeView簡化CTreeCtrl的用法afxcview.h
CTypedPtrArrayafxtempl.h
CTypedPtrListafxtempl.h
CTypedPtrMapafxtempl.h
CUIntArrayafxcoll.h
CUserExceptionafxwin.h
CView用於顯示程式數據的類afxwin.h
CWaitCursorafxwin.h
CWinAppafxwin.h
CWindowDCafxwin.h
CWinThread代表一個應用程式中的一個執行緒afxwin.h
CWndafxwin.h
CWordArrayafxcoll.h
MFC相關
有趣的是,MFC使用“Afx”作為所有的全局函式的前綴,“afx”作為全局變數的前綴。因為在MFC的早期開發階段它叫“ApplicationFrameworkExtensions”縮寫為“AFX”。AFX提供了對WindowsAPI的高度抽象,建立了全新的面向對象的AFXAPI,但它對於新手來說太複雜了,所以AFX小組不得不重新開始。後來他們創建了一組C++類,這就是MFC。MFC這個名字被採用得太晚了以至於沒來得及修改這些引用。MFC8.0和VisualStudio2005一起發布了;MFC9.0和VisualStudio2008一起發布。在免費的Express版本的VisualStudio2005/2008中沒有包含MFC。
MFC作為一個強有力的競爭對手,為Borland的TurboC++編譯器設計OWL(ObjectWindowsLibrary)在同一時間也發布了。但最後,Borland停止了對OWL的繼續開發並且不久就從Microsoft那裡購買了MFC頭檔案,動態程式庫等的授權,微軟沒有提供完整的MFC的集成支持。之後Borland發布了VCL(VisualComponentLibrary)來替換OWL框架。
數據類型
BOOL | 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的一個參數 |
特有類型
POSITION | 一個數值,代表collection對象中的元素位置,常用於MFC collection classes |
LPCRECT | 32-bit指針,指向一個不變的RECT結構 |
版本更新
新產品版本MFC版本
MicrosoftC/C++7.0MFC1.0
VisualC++1.0MFC2.0
VisualC++1.5MFC2.5
VisualC++2.0MFC3.0
VisualC++2.1MFC3.1
VisualC++2.2MFC3.2
VisualC++4.0MFC4.0(mfc40.dllincludedwithWindows95)
VisualC++4.1MFC4.1
VisualC++4.2MFC4.2(mfc42.dllincludedwiththeWindows98originalrelease)
eMbeddedVisualC++3.0MFC4.2(mfc42.dll)
VisualC++5.0MFC4.21(mfc42.dll)
VisualC++6.0MFC6.0(mfc42.dll)
eMbeddedVisualC++4.0none
VisualC++.NET2002MFC7.0(mfc70.dll)
VisualC++.NET2003MFC7.1(mfc71.dll)
VisualC++2005MFC8.0(mfc80.dll)
VisualC++2008MFC9.0.21022(mfc90.dll)
VisualC++2008withFeaturePackMFC9.0.30411(mfc90.dll)
VisualC++2010MFC10.0(mfc100.dll)
MFC擴展DLL
每個DLL都有某種類型的接口:變數、指針、函式、客戶程式訪問的類。它們的作用是讓客戶程式使用DLL,MFC擴展DLL可以有C++的接口。也就是它可以導出C++類給客戶端。導出的函式可以使用C++/MFC數據類型做參數或返回值,導出一個類時客戶端能創建類對象或者派生這個類。同時,在DLL中也可以使用DLL和MFC。
VisualC++使用的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真的沒有任何優勢了嗎?不是,面對底層程式,它能很輕鬆的與WindowsAPI或驅動程式結合,就是在自己的代碼中直接使用API函式,而API和驅動程式的資料都是以C語言為基礎的,這使得VC程式設計師能夠更輕鬆的使用WindowsAPI。這樣造成了一個很有意思的現象,即入門時VC程式設計師要付出更多的努力來學習,但是一旦掌握後,開發其他領域的程式或使用第三方軟體時,如工業控制類的程式,由於底層的程式都是用C語言編寫,反倒是VC程式設計師能夠更快的掌握該領域的編程技術。而很多其他的程式語言甚至找不到相關的資料。這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕鬆的語言框架。如果局限於某一領域的話VC毫無優勢可言,但是如果開發一個新的領域的應用程式或者該程式涉及多個套用領域的話,可減少重複學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。
相關書籍
(1)侯俊傑《深入淺出MFC》
(2)IvorHorton著李頌華康會光譯《VisualC++2005入門經典》
(3)CharlesPetzold《windows程式設計》