MFC Attach()函數和Detach()函數 .

來源:互聯網
上載者:User
一、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一起被銷毀,那麼在此之前,我們就先要把這個“臍帶”剪斷,以免“城門失火,殃及池魚”。

基本就是把一個控制代碼綁定和解除綁定定於一個類對象上,是其可以使用MFC的函數而不是API
 

程式碼
      if (oldbmp != NULL)
      {
       wdc.SelectObject(oldbmp);
      }
      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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.