MFC Attach 函式和Detach 函式

2021-09-06 11:45:22 字數 1173 閱讀 7752

一、windows物件和mfc物件的區別?

mfc物件實際上並沒有把整個windows物件都包裝在其中。

對於視窗:mfc物件它只是有乙個視窗控制代碼而已,這個視窗控制代碼如果指向乙個實際存在的視窗物件(視窗物件,也就是wndclass,是乙個windows物件),那麼這個mfc物件就是有效的,否則這個mfc物件是空的。

如果你還不明白,請回憶一下,當我們使用mfc建立乙個視窗時,是分兩步進行的:

第一步,new乙個cwnd物件,這一步是建立mfc物件,但是其中的hwnd還是非法的,因為對應的windows物件還沒有被建立出來;

第二步,呼叫cwnd的成員函式create建立真正的windows物件,同時,把先前建立的mfc的cwnd物件的hwnd成員指向該視窗,這樣才算建立完畢乙個視窗。

而如果你是用sdk方式,那麼只要建立乙個wndclass結構,然後呼叫create或者createex就建立了乙個視窗。   

二、attach  detach

【attach】 假設你已經有了乙個有效視窗控制代碼,那麼你想把這個視窗和乙個cwnd物件關聯起來怎麼辦?很簡單,用attach,其實就是讓乙個cwnd物件的hwnd成員指向這個視窗控制代碼。這就是attach主要完成的任務。

【detach】如前所述,wndclass其實和cwnd根本沒有什麼關係。它們之間只是通過cwnd的成員hwnd聯絡起來的。如果把attach看做「聯姻」的話,那麼detach就是「離婚」了,通俗地說,就是切斷乙個cwnd物件和乙個有效視窗的臍帶。為什麼要切斷呢?因為cwnd是c++的物件,c++的物件有乙個生存期的概念,脫離了該物件的作用域,這個物件就要被銷毀,但是windows物件沒有這個特點,當銷毀cwnd物件的時候,我們不一定希望wndclass一起被銷毀,那麼在此之前,我們就先要把這個「臍帶」剪斷,以免「城門失火,殃及池魚」。understand?

基本就是把乙個控制代碼繫結和解繫結於乙個類物件上,是其可以使用mfc的函式而不是api

程式**

if (oldbmp != null)

deleteobject(bmp.detach());  // bmp自定義的乙個位圖控制代碼

hbitmap hdib = createdibsection(wdc.m_hdc,&m_bmi,dib_rgb_colors,(void**)&m_pbyte,null,0);

assert(hdib);

bmp.attach(hdib);

MFC Attach 函式和Detach 函式

一 windows物件和mfc物件的區別?mfc物件實際上並沒有把整個windows物件都包裝在其中。對於視窗 mfc物件它只是有乙個視窗控制代碼而已,這個視窗控制代碼如果指向乙個實際存在的視窗物件 視窗物件,也就是wndclass,是乙個windows物件 那麼這個mfc物件就是有效的,否則這個m...

MFC Attach 函式和Detach 函式

一 windows物件和mfc物件的區別?mfc物件實際上並沒有把整個windows物件都包裝在其中。對於視窗 mfc物件它只是有乙個視窗控制代碼而已,這個視窗控制代碼如果指向乙個實際存在的視窗物件 視窗物件,也就是wndclass,是乙個windows物件 那麼這個mfc物件就是有效的,否則這個m...

巨集和函式和內聯函式

巨集和函式的區別 巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.巨集在編譯之前進行,即先用巨集體替換巨集名,然後再...