zoukankan      html  css  js  c++  java
  • 有关MFC类与其窗口句柄

    Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄。这就是Attach主要完成的任务。

    Detach。如前所述,WNDCLASS其实和CWnd根本没有什么关系。它们之间只是通过CWnd的成员HWND联系起来的。

    如果把 Attach看做“联姻”的话,那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗口的脐带。CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是句柄,(包括窗口句柄,DC句柄,线程句柄等)。m_hWnd,m_hDC,m_hThread如果这些类对象的这些句柄为空,就表示无效对象。假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是Valid的了。你可能跟踪看看Attach的实现,其实就是给m_hxxx赋值,而Detach就是值复位。

          

    CBitmap Detach和DeleteObject的关系

    注意:当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、图标以及菜单所占的内存资源;

    加速器表:DesteoyAcceleratorTable;

    位图:DeleteObject;

    光标:DestroyCursor;

    图标:Destroylcon;

    菜单:DestroyMenu

    HBITMAP/CBitmap/BITMAP 三者之间的关系转换:

    HBITMAP hBitmap;  

    CBitmap bitmap;  

    BITMAP bm;  

    bitmap.Attach(hBitmap);//由HBITMAP 得到关联的CBitmap  

    bitmap.GetBitmap(&bm); // 由CBitmap 得到关联的BITMAP  

    hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP 

    说明:

    1. Detach将使C++的对象与GDI对象分离开来,但二者都没有释放。此时必须分别用deletepBmp和DeleteObject将二者分别释放;

    2. m_Bitmap->DeleteObject将使GDI对象被释放,而C++对象本身不会释放。你可以用Attach重新使其与某个GDI对象关联,或者,用delete将其释放;

    3.deletepBmp(注意,我们假定析构时不调用DeleteObject)将使C++对象消亡,而对应的GDI对象依然存在。要使GDI对象释放,必须再次调用DeleteObject。

  • 相关阅读:
    ax2009 在工作区中放置多个窗体
    领料过账 与 退料过账
    微软或将向诺基亚支付10亿美元推广研发诺基亚Windows Phone手机
    数据库设计的三个范式(整理硬盘时找到的,虽然很久但还很有用)
    把企业的软件和项目外包的好处
    项目开发项目管理(转)
    如何为 iPad 打造速度超快的 HTML5 软件
    Windows Phone7成为诺基亚核心目标
    Windows Phone7官方更新 增加复制粘贴
    Silverlight4 GDR3与Silverlight5 EAP1的变化
  • 原文地址:https://www.cnblogs.com/arxive/p/11748240.html
Copyright © 2011-2022 走看看