Attach函数的讲解
Attach函数在MFC中是比较常见的,在不少类中都有这个成员函数例如CWnd类,CDC类,CBitmap类等。通用一点来说,
它的作用是:关联windows的资源句柄和c++对象,窗口是资源,绘图设备也是资源,所以它们的类中会有这个函数关联windows的资源句柄和c++对象。这么说好像很抽象,下面以CWnd类中的Attach详细讲解,当你看完再回过头来看这段话时,就会明白了。
CWnd::Attach
Attaches a Windows window to a CWnd object. //关联一个windows窗口到一个CWnd对象上
BOOL Attach(
HWND hWndNew
);
参数说明:
hWndNew
一个windows窗口的句柄
用处:将一个窗口attach到一个CWnd 对象上。(该函数为CWnd对象的成员函数,更好的理解是:一个C++的Cwnd对象在召唤一个Windows的window.)
概念:
C++对象和Windows窗口(窗口资源)的区别:
一段比较好的讲解:
首先,你要明白Windows窗口(窗口资源)和C++对象的区别。
MFC在封装CWnd类的时候,实际上并没有把整个Windows对象(窗口资源)都包装在其中,它只是有一个窗口句柄而已,这个窗 口句柄如果指向一个实际存在的窗口资源,那么这个C++对象就是有效的,否则这个C++对象是空的。
如果你还不明白,请回忆一下,当我们使用MFC创建一 个窗口时,是分两步进行的:
第一步,new一个CWnd对象,这一步是创建C++对象,但是其中的HWND还是非法的,因为对应的Windows窗口资源还没 有被创建出来;
第二步,调用CWnd的成员函数Create创建真正的Windows窗口资源,同时,把先前创建的CWnd对象的HWND成员指向该 窗口,这样才算创建完毕一个窗口。
而如果你是用SDK方式,那么只要创建一个WNDCLASS结构,然后调用Create或者CreateEx就创建了一 个窗口。
好,现在回答你的问题,你可以假设,现在你已经有了一个有效窗口资源的句柄,那么你想把这个窗口资源和一个CWnd对象关联起来怎么办?很简单,用Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄。这就是Attach主要完成的任务。
第二个,关于Detach。如前所述,WNDCLASS其实和CWnd根本没有什么关系。它们之间只是通过CWnd的成员HWND联系起来的。如果把 Attach看做“联姻”的话,那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗口的脐带。为什么要切断呢?因为 CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,但是Windows资源没有这个特点,当销毁 CWnd对象的时候,我们不一定希望WNDCLASS一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。
同样对于CBitmap中的Attach来说可以这么理解:
基本就是把一个位图资源句柄附加到一个CBitmap的对象上
比如你通过loadimage创建了一个位图资源,并得到了位图资源的句柄handle,现在想用cbitmap类的成员函数操作这个位图资源,
你就可以声明一个cbitmap对象,通过attach将他们关联在一起,
以后就可以使用cbitmap的成员函数来操作hbitmap了
总结:
Cwnd对象是个空壳壳,需要一个具体的Windows 窗口资源来填充。
上面用CWnd和CBitmap做了介绍,下面再用CDC做一个代码示例:
我想创建一个兼容屏幕DC的内存DC,然后在这个内存DC上做一些绘图操作,我们把创建内存DC这个过程分为两步:
1.获取屏幕dc
2.创建屏幕兼容的内存dc
/1.获取屏幕dc,注意这个函数得到的是 HDC句柄
HDC hdc = ::GetDC(NULL);
//创建一个CDC对象,并关联到得到的屏幕
dcCDC cDC;
cDC.Attach(hdc);CDC memDC;
//2.创建屏幕兼容的内存dc,注意CreateCompatibleDC函数的参数需要CDC类对象
memDC.CreateCompatibleDC(&cDC);
//其他绘图操作
...
由于第1步和第2步的参数参数类型不同,所以中间做了一个小小的转换,用到了Attach
注:这只是一个为了演示CDC使用Attach的例子,不要计较代码的实现方法。
Attach函数的讲解相关推荐
- php脚本函数,PHP执行系统命令函数实例讲解
命令注入 命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段. 常见的执行系统命令 ...
- R语言attach函数、detach函数(全局注册或者全局解除)实战
R语言attach函数.detach函数(全局注册或者全局解除)实战 目录 R语言attach函数.detach函数(全局注册或者全局解除)实战 #基本语法 # 仿真数据 # 如果没有attach就直 ...
- ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解
ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解 目录 sklearn库中的ShuffleSplit()函数和St ...
- Sklearn:sklearn.preprocessing之StandardScaler 的transform()函数和fit_transform()函数清晰讲解及其案例应用
Sklearn:sklearn.preprocessing之StandardScaler 的transform()函数和fit_transform()函数清晰讲解及其案例应用 目录 sklearn.p ...
- python3 next_对Python 3.2 迭代器的next函数实例讲解
在python中,使用iter函数可以获得有序聚合类型的迭代器,我个人将迭代器理解为带有next指针的单向链表,获取到的迭代器为链表的表头,表头内容为空,next指针指向有序聚合类型的第一个元素.在访 ...
- 浅析epoll – epoll函数深入讲解
前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要是分析epoll的函数,epoll高性能的深入分析. epoll的三大函数 1.创建epoll fd函数 int epo ...
- 【C语言】strlen函数的讲解和模拟实现
文章目录 strlen函数的讲解 strlen函数的模拟实现 计数器方式 递归的方式 指针减指针的方式 strlen函数的讲解 strlen函数我们应该不陌生,它可以帮助我们求字符串的长度(不包括'\ ...
- java trunc函数_Oracle常用函数Trunc及Trunc函数用法讲解
1. Trunc( date) trunc 以指定的元素截取日期类型的数据 语法:trunc(date,[ format]) date– 日期格式的值 format–日期格式 如'mm','yyyy' ...
- php explode用法,PHP explode()函数用法讲解
PHP explode()函数用法讲解 PHP explode() 函数 实例 把字符串打散为数组: 定义和用法 explode()函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组. 注释 ...
- python中append函数什么意思_python中append函数用法讲解
python中append函数用法讲解 如果在做一个地区的统计工作,可以使用列表来帮助我们.输入汉字或者其他字符,比如"01代表汉族",那么在写民族的时候有下拉列表,就可以打01, ...
最新文章
- redis 集合操作
- 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
- ubuntu14.04、CentOS安装oracle 11g数据库【转载】
- 纯虚函数能为private吗?
- Docker学习笔记 - Docker Compose
- 改变centos系统的时区
- WordPress基础教学:绝对必装的JetPack外挂
- IntellIJ IDEA 配置 Vue 支持
- java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档
- 寻找安全漏洞?谨慎为之
- Spring MVC 起步
- Windbg命令学习9,经典死锁(!cs和~~[TID])
- 《人工智能及其应用》1-6章
- AutoPlay Menu Builder入门教程
- 网络流——基础,Dinic和Sap(Gap优化)算法
- 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践读后感
- 2020年度个人总结--一个前端技术LD的年终盘点
- CART与ID3的区别C4.5离散化的过程
- 5分钟了解赴港上市公司CEO薪酬
- 本地代码上传到gitlab
热门文章
- 地下城与勇士正在自动连接频道服务器,地下城与勇士DNF进不去提示“正在连接服务器”解决方案...
- trivial、standard layout、POD和literal类型解析
- Python实现qq自动发送消息
- 计算机主机usb端口使用不了,电脑usb接口不能用怎么办
- pentaho report designer笔记
- FutureTask 中 get(timeout) 的超时是怎么玩的?
- 什么因素影响无刷马达绕线机的精度
- 用显卡测试软件蓝屏,简单几步解决w10更新显卡驱动后重启蓝屏的问题
- LeetCode简单题之三除数
- 【老九学堂】【初识C语言】编译过程