c++ mfc
引用:http://baike.baidu.com/view/10918.htm
MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫(class libraries),以C++類的形式封裝了Windows的API,并且包含一個應用程序框架,以減少應用程序開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。
目錄
編輯本段介紹
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,這跟Pascal和Delphi的關系一個道理。Pascal是Delphi的語言基礎,Delphi使用Pascal規范來進行Win下應用程序的開發和編譯,卻不同于Basic語言和VB的關系。Basic語言在VB開發出來被應用的年代已經成了Basic語言的新規范,VB新加的Basic語言要素,如面向對象程序設計的要素,是一種性質上的飛躍,使VB既是一個IDE,又成長成一個新的程序設計語言)。MFC同BC++集成的VCL一樣是一個非外掛式的軟件包類庫,只不過MFC類是微軟為VC++專配的。 MFC是Win?API與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的學習中最難的部分是指針,C++面向對象程序設計的其它部分,如數據類型、流程控制都不難,建議學習數據結構C++版。 MFC是微軟封裝了的API。什么意思呢?Windows作為一個提供功能強大的應用程序接口編程的操作系統,的確方便了許多程序員,傳統的win32開發(直接使用Windows的接口函數API)對于程序員來說非常的困難,因為,API函數實在太多了,而且名稱很亂,從零構架一個窗口動輒就是上百行的代碼。MFC是面向對象程序設計與Application framework的完美結合,他將傳統的API進行了分類封裝,并且為你創建了程序的一般框架。 MFC是對WindowsAPI的封裝,大大簡化了我們的工作;學VC主要就是要學MFC,大約有100多個類,但常用的也就二三十個。應該象背4級單詞一樣將這些常用類搞懂;當然不要死記,要通過看幫助、看例子、動手練習來學會它們;而且,并非每個類的內部的所有函數都要學會,要日積月累。如果真的想成為高手,做個筆記本把自己認為重要的類、函數記下來,隨時學習,也是很好的突擊方法。編輯本段重要的MFC
CWnd:窗口,它是大多數“看得見的東西”的父類(Windows里幾乎所有看得見的東西都是一個窗口,大窗口里有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CToolBar、對話框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使用“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。 作為一個強有力的競爭對手,為Borland的Turbo C++編譯器設計OWL(Object Windows Library)在同一時間也發布了。但最后,Borland停止了對OWL的繼續開發并且不久就從Microsoft那里購買了MFC頭文件,動態鏈接庫等的授權,微軟沒有提供完整的MFC的集成支持。之后Borland發布了VCL(Visual Component Library)來替換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版本 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.dll?included with Windows 95) Visual C++ 4.1 MFC 4.1 Visual C++ 4.2 MFC 4.2 (mfc42.dll?included 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一些缺點日益突出。最重要的就是入門門檻相對其他語言要高,而且同樣完成一個任務代碼量相對較多。而原有的優勢如運行速度快等,也因為其他編程語言的日臻完善和個人電腦的運算速度增加而顯得不那么突出。MFC似乎江河日下。 但是MFC真的沒有任何優勢了嗎?不是,面對底層程序,它能很輕松的與Windows API或驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕松的使用Windows API。這樣造成了一個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是一旦掌握后,開發其他領域的程序或使用第三方軟件時,如工業控制類的程序,由于底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕松的語言框架。如果局限于某一領域的話VC毫無優勢可言,但是如果開發一個新的領域的應用程序或者該程序涉及多個應用領域的話,可減少重復學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。編輯本段相關書籍
(1)侯俊杰, 《深入淺出MFC》 (2)孫鑫.《VC++深入詳解》 (3)Ivor Horton著 李頌華 康會光 譯《Visual C++ 2005 入門經典》 開放分類:轉載于:https://www.cnblogs.com/sode/archive/2012/08/27/2658590.html
總結
- 上一篇: 基于读取车载RFID标签自动开关车库门c
- 下一篇: Mysql 去除 特定字符后面的所有字符