標籤:利用 等等 編輯 class 變數 操作 很多 16px 封裝
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之間的比較