特性
Visual C++包含MFC應用程式嚮導,可用於兼容MFC的應用程式。在ATL程式中也可以手動添加MFC支持。在嚮導中有各種選項以定製生成的程式的功能,例如界面風格、語種、資料庫開發支持、列印支持、自動化支持、ActiveX支持、網路支持、基於HTML的幫助文檔支持等等。
在COM開發方面,相對於ATL來說,MFC的組件比較大,代碼不夠短小精悍,但是支持的功能也比較多,例如有對ActiveX Document的封裝類。
在界面開發方面,MFC提供對訊息循環的封裝,使用訊息映射來避免虛函式的開銷。MFC也提供常用Windows通用控制項的封裝類。
MFC擴展DLL的接口使得MFC程式可以直接調用MFC擴展DLL中的MFC類。MFC也支持在標準DLL中被使用。
發展
MFC是在1992年隨微軟的Microsoft C/C++ 7.0編譯器發布的,用於面向16位Windows的軟體開發。起初,MFC是作為一個應用程式框架開發的,所以定名為Application Framework eXtensions(AFX)。
隨著Visual Basic和Visual Studio .NET的發布,曾經一度被微軟重點推薦的MFC被Visual Basic .NET、C#、Windows Forms搶走了不少市場份額,但是MFC繼續在非託管軟體開發中占據重要地位。在託管開發方面,MFC中也包括對Windows Forms和託管/非託管互操作的封裝。微軟在Windows Vista和Windows 7發布之後在MFC中增加了對新的Windows API支持。
MFC的優點
MFC的主要優點是可以用面向對象的方法來調用Windows API,以及能夠更加便捷地開發應用程式。MFC將很多應用程式開發中常用的功能自動化,並且提供了文檔框架視圖結構和活動文檔這樣的便於自定義的應用程式框架。同時,在Visual C++內部也內建了很多對MFC的例如類嚮導這樣的支持以減少軟體開發的時間,使用類嚮導可以快速生成Hello World程式。
MFC的缺點
雖然MFC的原始碼對用戶是完全開放的,但是MFC的一些封裝過程過於複雜,以致於新用戶很難迅速掌握MFC的應用程式框架,以及在調試中定位問題的位置。同時,很多MFC對象不是執行緒安全的,致使在跨執行緒訪問MFC對象時需要編寫額外的代碼。另外,MFC的很多類依賴於應用程式嚮導生成的代碼,使得在使用Visual C++中其他類型的應用程式嚮導生成的工程中添加MFC支持的難度大大增加。
第三方支持
很多商用類庫在MFC的基礎上進一步實現了皮膚、漸變風格、多頂層視窗程式、屬性列表等較受歡迎的功能;同時,在C++線上社區中,很大一部分開放的原始碼也是基於MFC的。
支持MFC的DLL開發
使用Visual C++可以開發3種DLL:
•不使用MFC的DLL;
•使用MFC的規則的DLL:輸出的函式不涉及MFC,因此可以被支持/不支持MFC的應用程式調用該DLL
•動態連結到MFC(Regular DLLs statically linked to MFC)。
•靜態連結到MFC(Regular DLLs dynamically linked to MFC)
•使用MFC的擴展DLL(Extension DLLs),只能動態連結到MFC:輸出的函式涉及MFC,也可以輸出基於MFC的派生類。
由於DLL與調用它的應用程式都可以有自己的MFC全局數據與句柄映射(handle mapping),如果句柄值相同,則默認使用應用程式的映射到的資源。為了不互相干擾,允許DLL內部使用自己的資源,必須在DLL函式的入口處把資源模組句柄從默認的應用程式切換為該DLL。辦法是:
1.在該DLL的每個輸出的函式的最開始之處調用AFX_MANAGE_STATE(AfxGetStaticModuleState( ))。函式AfxGetStaticModuleState的功能是在運行棧上創建一個AFX_MODULE_STATE類的實例,對其進行設定,函式返回值為AFX_MODULE_STATE的指針。AFX_MODULE_STATE類利用其構造函式和析構函式進行模組狀態現場存儲及恢復。
2.使用AfxGetResourceHandle();獲取當前資源模組句柄。使用AfxSetResourceHandle(HINSTANCE xxx); 設定程式要使用的資源模組句柄。