Windows對象、控制代碼與MFC對象

來源:互聯網
上載者:User
Windows對象、控制代碼與MFC對象

 (2009-04-28 22:11:34)

轉載
標籤: 

windows對象

 

控制代碼

 

mfc對象

 

雜談
分類: MFC以及Windows編程
  Windows對象是以控制代碼來標識的,對應的MFC類就是這些控制代碼的C++封裝。記憶體中的Windows對象一定有唯一的控制代碼來標識,但不一定有對應的MFC類對象在記憶體中。當需要擷取Windows對象的對應MFC類對象而記憶體中又沒有此對象時,系統會建立一個臨時MFC類對象返回給使用者,並在之後某個空閑時刻進行回收。   Windows物件控點及其對應的MFC類如下表所示:

HWND

CWnd及衍生類別

HDC

CDC及衍生類別

HMENU

CMenu

HPEN、HBRUSH、HFONT、HBITMAP、HPALETTE、HRGN

CGdiObject

HIMAGELIST

CImageList

SOCKET

CSocket

  如果你擁有上面的任何一個Windows物件控點,你可以調用對應類的靜態成員函數FromHandle來尋找對應的MFC對象(系統為每個線程維護了一個從Windows物件控點到MFC對象的映射,一個持久的map和一個臨時的map);如果你擁有上面的MFC對象,你也可以通過MFC類的公有成員變數來擷取對應的Windows物件控點。   例如,給定一個HWND類型的控制代碼hWnd,可以通過

CWnd::FromHandle(hWnd);

來獲得CWnd對象的指標。如果hWnd沒有對應的CWnd對象,則系統會產生一個臨時CWnd對象與hWnd關聯,並返回該對象的指標。在獲得CWnd對象後,你可以通過CWnd的公有成員m_hWnd獲得視窗對象的控制代碼。

   如果在調用FromHandle時產生臨時MFC對象,控制代碼和MFC對象之間的映射被儲存在系統的臨時map中。預設情況下,CWinThread::OnIdle自動為那些支援臨時控制代碼映射的MFC類調用DeleteTempMap函數。在DeleteTempMap函數中,這些臨時對象將被取消與控制代碼的關聯,然後被銷毀。   如果你擁有一個Windows物件控點,那麼你可以建立一個對應的MFC對象,然後把該MFC對象與該Windows物件控點進行關聯。此時,該MFC對象與Windows對象相互建立起映射關係。   例如,對於如下代碼:

CWnd  myWnd;

myWnd.Attach(hWnd);

將建立起hWnd到myWnd的映射。此後,你調用CWnd::FromHandle(hWnd)將返回myWnd對象的指標。如果myWnd對象被銷毀,它的解構函式將自動通過調用DestroyWindow來銷毀該hWnd所指Windows對象。如果該行為不是所期望的,則需要在myWnd銷毀之前調用Detach成員函數解除兩者之間的關聯(映射),如 myWnd.Detach()。   所有臨時MFC對象和持久(permanent)MFC對象都是以線程為單位進行維護管理的。也就是說,一個線程不能夠訪問另一個線程的MFC封裝類對象,不管它是臨時的還是持久的。   為了在不同的線程間傳遞這些Windows對象,總是應該通過HANDLE類型傳遞。從一個線程向另一個線程傳遞MFC封裝對象將可能引起不可預料的結果。   由於MFC封裝類對象是以線程為單位進行管理的,因此,在程式中的不同線程中可能有多個MFC對象與同一個控制代碼對應。   存在的疑問:如果同一線程中有多個MFC對象Attach同一控制代碼,那麼對該控制代碼調用FromHandle將返回哪個MFC對象呢?未定義行為?
  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.