程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> MFC和Win32

MFC和Win32

編輯:關於C語言

 

MFC Object和Windows Object的關系

MFC中最重要的封裝是對Win32 API的封裝,因此,理解Windows Object和MFC Object (C++對象,一個C++類的實例)之間的關系是理解MFC的關鍵之一。所謂Windows Object(Windows對象)是Win32下用句柄表示的Windows操作系統對象;所謂MFC Object (MFC對象)是C++對象,是一個C++類的實例,這裡(本書范圍內)MFC Object是有特定含義的,指封裝Windows Object的C++ Object,並非指任意的C++ Object。

MFC Object和Windows Object是不一樣的,但兩者緊密聯系。以窗口對象為例:

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

 

下面,對MFC Object和Windows Object作一個比較。有些論斷對設備描述表(MFC類是CDC,句柄是HDC)可能不適用,但具體涉及到時會指出。

從數據結構上比較

MFC Object是相應C++類的實例,這些類是MFC或者程序員定義的;

Windows Object是Windows系統的內部結構,通過一個句柄來引用;

MFC給這些類定義了一個成員變量來保存MFC Object對應的Windows Object的句柄。對於設備描述表CDC類,將保存兩個HDC句柄。

從層次上講比較

MFC Object是高層的,Windows Object是低層的;

MFC Object封裝了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接應用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相應的MFC Object的成員函數。

從創建上比較

MFC Object通過構造函數由程序直接創建;Windows Object由相應的SDK函數創建。

MFC中,使用這些MFC Object,一般分兩步:

首先,創建一個MFC Object,或者在STACK中創建,或者在HEAP中創建,這時,MFC Object的句柄實例變量為空,或者說不是一個有效的句柄。

然後,調用MFC Object的成員函數創建相應的Windows Object,MFC的句柄變量存儲一個有效句柄。

CDC(設備描述表類)的創建有所不同,在後面的2.3節會具體說明CDC及其派生類的創建和使用。

當然,可以在MFC Object的構造函數中創建相應的Windows對象,MFC的GDI類就是如此實現的,但從實質上講,MFC Object的創建和Windows Object的創建是兩回事。

從轉換上比較

可以從一個MFC Object得到對應的Windows Object的句柄;一般使用MFC Object的成員函數GetSafeHandle得到對應的句柄。

可以從一個已存在的Windows Object創建一個對應的MFC Object; 一般使用MFC Object的成員函數Attach或者FromHandle來創建,前者得到一個永久性對象,後者得到的可能是一個臨時對象。

從使用范圍上比較

MFC Object對系統的其他進程來說是不可見、不可用的;而Windows Object一旦創建,其句柄是整個Windows系統全局的。一些句柄可以被其他進程使用。典型地,一個進程可以獲得另一進程的窗口句柄,並給該窗口發送消息。

對同一個進程的線程來說,只可以使用本線程創建的MFC Object,不能使用其他線程的MFC Object。

從銷毀上比較

MFC Object隨著析構函數的調用而消失;但Windows Object必須由相應的Windows系統函數銷毀。

設備描述表CDC類的對象有所不同,它對應的HDC句柄對象可能不是被銷毀,而是被釋放。

當然,可以在MFC Object的析構函數中完成Windows Object的銷毀,MFC Object的GDI類等就是如此實現的,但是,應該看到:兩者的銷毀是不同的。

每類Windows Object都有對應的MFC Object,下面用表格的形式列出它們之間的對應關系,如表2-1所示:

表2-1 MFC Object和Windows Object的對應關系

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved