(1)MFC簡介及MFC Object與Windows Object之間的比較
MFC(微軟基礎類庫)
微軟基礎類庫(Microsoft Foundation Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了Windows API,並且包含一個應用程序框架,以減少應用程序開發人員的工作量。其中包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。
VC++簡介:
vc++是微軟公司開發的c/c++的集成開發環境,所謂集成開發環境,就是說利用它可以編輯,編譯,調試,而不是使用多種工具輪換操作,靈活性較大。vc也指它的內部編譯器,集成開發環境必須有一個編譯器內核,例如DevC++其中一個編譯器內核就是gcc。 MFC除了是一個類庫以外,還是一個框架,在vc++裏新建一個MFC的工程,開發環境會自動幫你產生許多文件,同時它使用了mfcxx.dll
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之間的比較