黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Windows對(duì)象、句柄與MFC對(duì)象

系統(tǒng) 3649 0

Windows對(duì)象、句柄與MFC對(duì)象

(2009-04-28 22:11:34)
  Windows對(duì)象是以句柄來(lái)標(biāo)識(shí)的,對(duì)應(yīng)的MFC類就是這些句柄的C++包裝。內(nèi)存中的Windows對(duì)象一定有唯一的句柄來(lái)標(biāo)識(shí),但不一定有對(duì)應(yīng)的MFC類對(duì)象在內(nèi)存中。當(dāng)需要獲取Windows對(duì)象的對(duì)應(yīng)MFC類對(duì)象而內(nèi)存中又沒(méi)有此對(duì)象時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)臨時(shí)MFC類對(duì)象返回給用戶,并在之后某個(gè)空閑時(shí)刻進(jìn)行回收。
  Windows對(duì)象句柄及其對(duì)應(yīng)的MFC類如下表所示:

HWND

CWnd 及派生類

HDC

CDC 及派生類

HMENU

CMenu

HPEN HBRUSH HFONT HBITMAP HPALETTE HRGN

CGdiObject

HIMAGELIST

CImageList

SOCKET

CSocket


  如果你擁有上面的任何一個(gè)Windows對(duì)象句柄,你可以調(diào)用對(duì)應(yīng)類的靜態(tài)成員函數(shù)FromHandle來(lái)查找對(duì)應(yīng)的MFC對(duì)象(系統(tǒng)為每個(gè)線程維護(hù)了一個(gè)從Windows對(duì)象句柄到MFC對(duì)象的映射,一個(gè)持久的map和一個(gè)臨時(shí)的map);如果你擁有上面的MFC對(duì)象,你也可以通過(guò)MFC類的公有成員變量來(lái)獲取對(duì)應(yīng)的Windows對(duì)象句柄。
  例如,給定一個(gè)HWND類型的句柄hWnd,可以通過(guò)

CWnd::FromHandle(hWnd)

來(lái)獲得CWnd對(duì)象的指針。如果hWnd沒(méi)有對(duì)應(yīng)的CWnd對(duì)象,則系統(tǒng)會(huì)產(chǎn)生一個(gè)臨時(shí)CWnd對(duì)象與hWnd關(guān)聯(lián),并返回該對(duì)象的指針。在獲得CWnd對(duì)象后,你可以通過(guò)CWnd的公有成員m_hWnd獲得窗口對(duì)象的句柄。
  如果在調(diào)用FromHandle時(shí)產(chǎn)生臨時(shí)MFC對(duì)象,句柄和MFC對(duì)象之間的映射被保存在系統(tǒng)的臨時(shí)map中。默認(rèn)情況下,CWinThread::OnIdle自動(dòng)為那些支持臨時(shí)句柄映射的MFC類調(diào)用DeleteTempMap函數(shù)。在DeleteTempMap函數(shù)中,這些臨時(shí)對(duì)象將被取消與句柄的關(guān)聯(lián),然后被銷毀。
  如果你擁有一個(gè)Windows對(duì)象句柄,那么你可以創(chuàng)建一個(gè)對(duì)應(yīng)的MFC對(duì)象,然后把該MFC對(duì)象與該Windows對(duì)象句柄進(jìn)行關(guān)聯(lián)。此時(shí),該MFC對(duì)象與Windows對(duì)象相互建立起映射關(guān)系。
  例如,對(duì)于如下代碼:

CWnd myWnd;

myWnd.Attach(hWnd);

將建立起hWnd到myWnd的映射。此后,你調(diào)用CWnd::FromHandle(hWnd)將返回myWnd對(duì)象的指針。如果myWnd對(duì)象被銷毀,它的析構(gòu)函數(shù)將自動(dòng)通過(guò)調(diào)用DestroyWindow來(lái)銷毀該hWnd所指Windows對(duì)象。如果該行為不是所期望的,則需要在myWnd銷毀之前調(diào)用Detach成員函數(shù)解除兩者之間的關(guān)聯(lián)(映射),如 myWnd.Detach()。
所有臨時(shí)MFC對(duì)象和持久(permanent)MFC對(duì)象都是以線程為單位進(jìn)行維護(hù)管理的。也就是說(shuō),一個(gè)線程不能夠訪問(wèn)另一個(gè)線程的MFC包裝類對(duì)象,不管它是臨時(shí)的還是持久的。
  為了在不同的線程間傳遞這些Windows對(duì)象,總是應(yīng)該通過(guò)HANDLE類型傳遞。從一個(gè)線程向另一個(gè)線程傳遞MFC包裝對(duì)象將可能引起不可預(yù)料的結(jié)果。
  由于MFC包裝類對(duì)象是以線程為單位進(jìn)行管理的,因此,在程序中的不同線程中可能有多個(gè)MFC對(duì)象與同一個(gè)句柄對(duì)應(yīng)。
  存在的疑問(wèn):如果同一線程中有多個(gè)MFC對(duì)象Attach同一句柄,那么對(duì)該句柄調(diào)用FromHandle將返回哪個(gè)MFC對(duì)象呢?未定義行為?

Windows對(duì)象、句柄與MFC對(duì)象


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論