博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Attach()和Detach()函数
阅读量:6866 次
发布时间:2019-06-26

本文共 1115 字,大约阅读时间需要 3 分钟。

一、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);

 

转载于:https://www.cnblogs.com/tinaluo/p/7363572.html

你可能感兴趣的文章
Node.js 核心事件 Events
查看>>
Thinkphp3.2.3分页使用实例解析
查看>>
光谷码农·每日新闻(2019-05-08)
查看>>
命令行设置环境变量
查看>>
PHP魔术方法学习笔记
查看>>
征集令 | 赢首届 Kylin Data Summit 门票!
查看>>
VM 虚拟机固定IP方法
查看>>
angularjs中的 $emit, $broadcast, $on
查看>>
MySQL的JOIN(一):用法
查看>>
HBase入门——HBase入门系列链接
查看>>
Linux下维护项目常用到的命令(自分)
查看>>
maven 之pom.xml文件
查看>>
springboot开发之定时器quartz 定时任务调度(压缩版,抽取quartz的单个任务表实现)...
查看>>
Spring Boot国际化开发实战
查看>>
为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
查看>>
4.6 包
查看>>
springboot 常用注解
查看>>
Javascript获取节点的几种方式
查看>>
nginx备忘录
查看>>
如何编写一个够逼格的标题栏(磨砺营马剑威Android)
查看>>