Windows物件 控制代碼與MFC物件

2021-10-10 05:02:21 字數 1617 閱讀 6259

windows物件是以

控制代碼來標識的,

對應的mfc類就是這些控制代碼的c++包裝

。記憶體中的windows物件一定有唯一的控制代碼來標識,但

不一定有對應的mfc類物件在記憶體中

。當需要獲取windows物件的對應mfc類物件而記憶體中又沒有此物件時,系統會建立乙個

臨時mfc類物件

返回給使用者,並在之後某個空閒時刻進行**。

windows物件控制代碼及其對應的mfc類如下表所示:

hwnd

cwnd及派生類

hdccdc及派生類

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物件與同乙個控制代碼對應。

Windows物件 控制代碼與MFC物件

windows物件是以控制代碼來標識的,對應的mfc類就是這些控制代碼的c 包裝。記憶體中的windows物件一定有唯一的控制代碼來標識,但不一定有對應的mfc類物件在記憶體中。當需要獲取windows物件的對應mfc類物件而記憶體中又沒有此物件時,系統會建立乙個臨時mfc類物件返回給使用者,並在之...

深入解析MFC 控制代碼與物件的關係

在windows體系中,很多物件都是以控制代碼的形式展示給開發人員的。比如視窗控制代碼 hwnd 繪圖裝置 hdc 等等。然後大部分的api函式則圍繞這些控制代碼做文章。比如showwindow,setwindowtext,textout等等。這些api函式的第乙個引數通常就是控制代碼了。但是在c ...

控制代碼類 windows核心物件

首先,你要明白windows物件和c 物件的區別。c 物件 即mfc類cwnd 實際上並沒有把整個windows物件都包裝在其中,它只是有乙個視窗控制代碼。在msdn上檢視cwnd類的成員變數,確實只有乙個hwnd hwnd,成員函式有attach 和dettach create 等 這個視窗控制代...