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。

  • 相关阅读:
    窗口函数ntile()
    窗口函数--over (partiton by order by)
    select top x with ties和select语句执行顺序
    被LTRIM(RTRIM())害死了,差点
    SQL Server 查询实例、数据库、表、列
    maven3 手动安装本地jar到仓库
    Maven3路程(六)用Maven创建Spring3 MVC项目
    Maven3路程(五)用Maven创建Hibernate项目
    在Maven仓库中添加Oracle JDBC驱动
    Maven3路程(四)用Maven创建Struts2项目
  • 原文地址:https://www.cnblogs.com/arxive/p/11748240.html
Copyright © 2011-2022 走看看