1. 程式人生 > >(1)MFC簡介及MFC Object與Windows Object之間的比較

(1)MFC簡介及MFC Object與Windows Object之間的比較

libraries 並且 bsp 應用 ets 銷毀 靈活 eight 公司

MFC(微軟基礎類庫)

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

VC++簡介:

vc++是微軟公司開發的c/c++的集成開發環境,所謂集成開發環境,就是說利用它可以編輯,編譯,調試,而不是使用多種工具輪換操作,靈活性較大。vc也指它的內部編譯器,集成開發環境必須有一個編譯器內核,例如DevC++其中一個編譯器內核就是gcc。 MFC除了是一個類庫以外,還是一個框架,在vc++裏新建一個MFC的工程,開發環境會自動幫你產生許多文件,同時它使用了mfcxx.dll

。xx是版本,它封裝了mfc內核,所以你在你的代碼看不到原本的SDK編程中的消息循環等等東西,因為MFC框架幫你封裝好了,這樣你就可以專心的考慮你程序的邏輯,而不是這些每次編程都要重復的東西,但是由於是通用框架,沒有最好的針對性,當然也就喪失了一些靈活性和效率。但是MFC的封裝很淺,所以效率上損失不大。

MFC中最重要的封裝是對Win32 API的封裝,理解MFC的關鍵是理解Windows Object和MFC Object (C++對象,一個C++類的實例)之間的關系;其中,Windows Object(Windows對象)是Win32下用句柄表示的Windows操作系統對象;而MFC Object (MFC對象)是C++對象,是一個C++類的實例,封裝了Windows Object(windows對象)的C++ Object,並非指任意的C++ Object。

  

MFC Object 和Windows Object是不一樣的,但兩者緊密聯系;

下面以C++的窗口對象和window的窗口為例,簡單說說其中的聯系:

一個MFC窗口對象是一個C++ CWnd類(或派生類)的實例,是程序直接創建的。在程序執行中它隨著窗口類構造函數的調用而生成,隨著析構函數的調用而消失。但Windows窗口則是Windows系統的一個內部數據結構的實例,由一個“窗口句柄”標識,Windows系統創建它並給它分配系統資源。Windows窗口在MFC窗口對象創建之後,由CWnd類的Create成員函數創建,“窗口句柄”保存在窗口對象的m_hWnd成員變量中。Windows窗口可以被一個程序銷毀,也可以被用戶的動作銷毀;

下面將作出一些比較:

(1)數據結構不同:

  MFC Object是相應C++類的實例,這些類是MFC或者程序員定義的;Windows Object是Windows系統的內部結構,通過一個句柄來引用;

(2)層次上的不同:   

  MFC Object是高層的,Windows Object是低層的;MFC Object封裝了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接應用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相應的MFC Object的成員函數。 (3)創建方式的不同:   MFC Object通過構造函數由程序直接創建;Windows Object由相應的SDK函數創建。MFC中,使用這些MFC Object,一般分兩步:首先,創建一個MFC Object,或者在棧中創建,或者在堆中創建,這時,MFC Object的句柄實例變量為空,或者說不是一個有效的句柄。然後,調用MFC Object的成員函數創建相應的Windows Object,MFC的句柄變量存儲一個有效句柄。 (4)使用範圍的不同:   MFC Object對系統的其他進程來說是不可見、不可用的;而Windows Object一旦創建,其句柄是整個Windows系統全局的。一些句柄可以被其他進程使用。典型地,一個進程可以獲得另一進程的窗口句柄,並給該窗口發送消息。對同一個進程的線程來說,只可以使用本線程創建的MFC Object,不能使用其他線程的MFC Object。 (5)銷毀上的不同:   MFC Object隨著析構函數的調用而消失;但Windows Object必須由相應的Windows系統函數銷毀。設備描述表CDC類的對象有所不同,它對應的HDC句柄對象可能不是被銷毀,而是被釋放。當然,可以在MFC Object的析構函數中完成Windows Object的銷毀,MFC Object的GDI類等就是如此實現的,但是,應該看到:兩者的銷毀是不同的。 怎樣轉換在MFC Object和Windows對象之間進行轉換呢?   可以從一個MFC Object得到對應的Windows Object的句柄;一般使用MFC Object的成員函數GetSafeHandle得到對應的句柄。可以從一個已存在的Windows Object創建一個對應的MFC Object; 一般使用MFC Object的成員函數Attach或者FromHandle來創建,前者得到一個永久性對象,後者得到的可能是一個臨時對象。 MFC Object和Windows Object的對應關系:
描述 Windows句柄 MFC Object
窗口 HWND CWnd and CWnd-derived classes
設備上下文 HDC CDC and CDC-derived classes
菜單 HMENU CMenu
HPEN CGdiObject類,CPen和CPen-derived classes
刷子 HBRUSH CGdiObject類,CBrush和CBrush-derived classes
字體 HFONT CGdiObject類,CFont和CFont-derived classes
位圖 HBITMAP CGdiObject類,CBitmap和CBitmap-derived classes
調色板 HPALETTE CGdiObject類,CPalette和CPalette-derived classes
區域 HRGN CGdiObject類,CRgn和CRgn-derived classes
圖像列表 HimageLIST CimageList和CimageList-derived classes
套接字 SOCKET CSocket,CAsynSocket及其派生類

其中:GDI對象包括BITMAP,BRUSH,FONT,PALETTE,PEN,RGN;

(1)MFC簡介及MFC Object與Windows Object之間的比較