MFC(微軟基礎類庫)

MFC(微軟基礎類庫)

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

基本介紹

  • 中文名:微軟基礎類庫
  • 外文名:Microsoft Foundation Classes
  • 開發公司:微軟公司
  • 編譯平台:C++ SDK
  • 程式語言:C++
  • 適用平台:Windows
簡單介紹,特點,關鍵技術,MFC程式的初始化過程,運行時類型識別(RTTI),動態創建,永久保存,訊息映射,訊息傳遞,重要MFC,MFC類別,MFC相關,數據類型,特有類型,版本更新,MFC擴展DLL,編程優勢,相關書籍,

簡單介紹

MFC:微軟基礎類(Microsoft Foundation Classes),同VCL類似,是一種應用程式框架,隨微軟Visual C++開發工具發布。目前最新版本為10.0(截止2011年3月),並且發布了中文版。該類庫提供一組通用的可重用的類庫供開發人員使用,大部分類均從CObject 直接或間接派生,只有少部分類例外。
MFC應用程式的總體結構通常由開發人員從MFC類派生的幾個類和一個CWinApp類對象(應用程式對象)組成。MFC 提供了MFC AppWizard 自動生成框架
Windows 應用程式中,MFC 的主包含檔案為Afxwin.h
此外MFC的部分類為MFC/ATL 通用,可以在Win32 應用程式中單獨包含並使用這些類。
由於它的易用性,初學者常誤認為VC++開發必須使用MFC,這種想法是錯誤的。作為Application Framework,MFC的使用只能提高某些情況下的開發效率,只起到輔助作用,而不能替代整個Win32 程式設計。

特點

MFC實際上是微軟提供的,用於在C++環境下編寫應用程式的一個框架和引擎。VC++Windows下開發人員使用的專業C++ SDK(SDK,Standard SoftWare Develop Kit,專業軟體開發平台),MFC就是掛在它之上的一個輔助軟體開發包。MFC作為與VC++血肉相連的部分(注意C++和VC++的區別:C++是一種程式設計語言,是一種大家都承認的軟體編制的通用規範;而VC++只是一個編譯器,或者說是一種編譯器+源程式編輯器的IDE(IDE的英文全稱為“Integrated Development Environment”,即“集成開發環境”),WSPlatForm,這跟PascalDelphi的關係一個道理。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級單詞一樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,並非每個類的內部的所有函式都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函式記下來,隨時學習,也是很好的突擊方法。

關鍵技術

MFC程式的初始化過程

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

運行時類型識別(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要做的事情很多,如最佳化訊息,增強兼容性等,這一大量的工作,有些甚至用彙編語言來完成,對此,我們很難深究它。所以我們要省略大量代碼,理性地分析它。

重要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.h
CArchive afx.h
CArchiveException afx.h
CArray afxtempl.h
CAsyncMonikerFile 在ActiveX控制項中提供對異步標記的支持 afxole.h
CAsyncScoket 封裝Windows Sockets API,參看CSocket afxsock.h
CBitmap afxwin.h
CBitmapButton afxext.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
CCommandLineInfo afxwin.h
CCommonDialog afxdlgs.h
CConnectionPoint afxdisp.h
CControlBar afxext.h
CCreateContext afxext.h
CCriticalSection afxmt.h
CCtrlView afxwin.h
CDaoDatabase afxdao.h
CDaoException afxdao.h
CDaoFieldExchange afxdao.h
CDaoQueryDef afxdao.h
CDaoRecordset 代表選自數據源的記錄集。CDaoRecordset對象可用於三種格式:表類型記錄集,動態集類型記錄集和快照類型記錄集 afxdao.h
CDaoRecordView 提供表單視圖,以在控制項中顯示資料庫記錄。表單視圖是CDaoRecordset對象的一部分。參考CFormView和CRecordView 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
CDocObjectServerItem 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
CFieldExchange afxdb.h
CFile afx.h
CFileDialog 通用檔案對話框,提供Open和Save As對話框中的功能 afxdlgs.h
CFileException afx.h
CFileFind afx.h
CFindReplaceDialog afxdlgs.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
CGopherConnection afxinet.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
CInternetException afxinet.h
CInternetFile afxinet.h
CInternetSession 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
CMapStringToString afxcoll.h
CMapWordToOb afxcoll.h
CMapWordToPtr afxcoll.h
CMDIChildWnd MDI(多文檔界面)子框架視窗 afxwin.h
CMDIFrameWnd afxwin.h
CMemFile afx.h
CMemoryException afx.h
CMemoryState
CMenu afxwin.h
CMetaFileDC afxext.h
CMiniFrameWnd 半高的框架視窗,主要用於浮動工具列。一個小框架視窗沒有最小化和最大化按鈕,但其他都類似於正常的框架視窗 afxwin.h
CMonikerFile afxole.h
CMonthCalCtrl 月曆控制項,用於顯示一個用戶可選擇日期的日曆 afxdtctl.h
CMultiDocTemplate afxwin.h
CMultiLock afxmt.h
CMutex afxmt.h
CNotSupportedException afx.h
CObArray afxcoll.h
CObject afx.h
CObList afxcoll.h
COleBusyDialog afxodlgs.h
COleChangeIconDialog afxodlgs.h
COleChangeSourceDialog afxodlgs.h
COleClientItem afxole.h
COleCmdUI afxdocob.h
COleControl afxctl.h
COleControlModule afxctl.h
COleConvertDialog afxodlgs.h
COleCurrency afxdisp.h
COleDataObject afxole.h
COleDataSource afxole.h
COleDateTime afxdisp.h
COleDateTimeSpan afxdisp.h
COleDBRecordView afxoledb.h
COleDialog afxodlgs.h
COleDispatchDriver afxdisp.h
COleDispatchException afxdisp.h
COleDocObjectItem afxole.h
COleDocument 把一個檔案看作為CDocItem對象的一個集合。包容器和伺服器都需要這個結構,因為它們的檔案必須能夠包含OLE項 afxole.h
COleDropSource afxole.h
COleDropTarget afxole.h
COleException afxdisp.h
COleInsertDialog afxodlgs.h
COleIPFrameWnd afxole.h
COleLinkingDoc OLE包容器檔案的基類,這些檔案支持對它們所包含項的連結 afxole.h
COleLinksDialog afxodlgs.h
COleMessageFilter afxole.h
COleObjectFactory afxdisp.h
COlePasteSpecialDialog afxodlgs.h
COlePropertiesDialog afxodlgs.h
COlePropertyPage afxctl.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
CPictureHolder afxctl.h
CPoint atltypes.h
CPrintDialog 通用列印對話框,提供Print和Print Setup對話框中的功能 afxdlgs.h
CPrintInfo
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
CRuntimeClass
CScrollBar 滾動條對象 afxwin.h
CScrollView 可滾動的視窗,派生於CView afxwin.h
CSemaphore afxmt.h
CSharedFile afxadv.h
CSingleDocTemplate afxwin.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

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框架。

數據類型

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
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都有某種類型的接口:變數、指針、函式、客戶程式訪問的類。它們的作用是讓客戶程式使用DLL,MFC擴展DLL可以有C++的接口。也就是它可以導出C++類給客戶端。導出的函式可以使用C++/MFC數據類型做參數或返回值,導出一個類時客戶端能創建類對象或者派生這個類。同時,在DLL中也可以使用DLL和MFC。
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真的沒有任何優勢了嗎?不是,面對底層程式,它能很輕鬆的與Windows API或驅動程式結合,就是在自己的代碼中直接使用API函式,而API和驅動程式的資料都是以C語言為基礎的,這使得VC程式設計師能夠更輕鬆的使用Windows API。這樣造成了一個很有意思的現象,即入門時VC程式設計師要付出更多的努力來學習,但是一旦掌握後,開發其他領域的程式或使用第三方軟體時,如工業控制類的程式,由於底層的程式都是用C語言編寫,反倒是VC程式設計師能夠更快的掌握該領域的編程技術。而很多其他的程式語言甚至找不到相關的資料。這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕鬆的語言框架。如果局限於某一領域的話VC毫無優勢可言,但是如果開發一個新的領域的應用程式或者該程式涉及多個套用領域的話,可減少重複學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。

相關書籍

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

相關詞條

熱門詞條

聯絡我們