一、Windows對象和MFC對象的區別?
MFC對象實(shí)際上并沒(méi)有把整個(gè)Windows對象都包裝在其中。
對于窗口:MFC對象它只是有一個(gè)窗口句柄而已,這個(gè)窗口句柄如果指向一個(gè)實(shí)際存在的窗口對象(窗口對象,也就是WNDCLASS,是一個(gè)Windows對象),那么這個(gè)MFC對象就是有效的,否則這個(gè)MFC對象是空的。
如果你還不明白,請回憶一下,當我們使用MFC創(chuàng )建一個(gè)窗口時(shí),是分兩步進(jìn)行的:
第一步,new一個(gè)CWnd對象,這一步是創(chuàng )建MFC對象,但是其中的HWND還是非法的,因為對應的Windows對象還沒(méi)有被創(chuàng )建出來(lái);
第二步,調用CWnd的成員函數Create創(chuàng )建真正的Windows對象,同時(shí),把先前創(chuàng )建的MFC的CWnd對象的HWND成員指向該窗口,這樣才算創(chuàng )建完畢一個(gè)窗口。
而如果你是用SDK方式,那么只要創(chuàng )建一個(gè)WNDCLASS結構,然后調用Create或者CreateEx就創(chuàng )建了一個(gè)窗口。
二、Attach Detach
【Attach】假設你已經(jīng)有了一個(gè)有效窗口句柄,那么你想把這個(gè)窗口和一個(gè)CWnd對象關(guān)聯(lián)起來(lái)怎么辦?很簡(jiǎn)單,用Attach,其實(shí)就是讓一個(gè)CWnd對象的HWND成員指向這個(gè)窗口句柄。這就是Attach主要完成的任務(wù)。
【Detach】如前所述,WNDCLASS其實(shí)和CWnd根本沒(méi)有什么關(guān)系。它們之間只是通過(guò)CWnd的成員HWND聯(lián)系起來(lái)的。如果把Attach看做“聯(lián)姻”的話(huà),那么Detach就是“離婚”了,通俗地說(shuō),就是切斷一個(gè)CWnd對象和一個(gè)有效窗口的臍帶。為什么要切斷呢?因為CWnd是C++的對象,C++的對象有一個(gè)生存期的概念,脫離了該對象的作用域,這個(gè)對象就要被銷(xiāo)毀,但是Windows對象沒(méi)有這個(gè)特點(diǎn),當銷(xiāo)毀CWnd對象的時(shí)候,我們不一定希望WNDCLASS一起被銷(xiāo)毀,那么在此之前,我們就先要把這個(gè)“臍帶”剪斷,以免“城門(mén)失火,殃及池魚(yú)”。Understand?
基本就是把一個(gè)句柄綁定和解綁定于一個(gè)類(lèi)對象上,是其可以使用MFC的函數而不是API
程序代碼
if (oldbmp != NULL)
{
wdc.SelectObject(oldbmp);
}
DeleteObject(bmp.Detach()); // bmp自定義的一個(gè)位圖句柄
HBITMAP hdib = CreateDIBSection(wdc.m_hDC,&m_bmi,DIB_RGB_COLORS,(void**)&m_pbyte,NULL,0);
ASSERT(hdib);
bmp.Attach(hdib);
聯(lián)系客服