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函数的讲解相关推荐

  1. php脚本函数,PHP执行系统命令函数实例讲解

    命令注入 命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段. 常见的执行系统命令 ...

  2. R语言attach函数、detach函数(全局注册或者全局解除)实战

    R语言attach函数.detach函数(全局注册或者全局解除)实战 目录 R语言attach函数.detach函数(全局注册或者全局解除)实战 #基本语法 # 仿真数据 # 如果没有attach就直 ...

  3. ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解

    ML之sklearn:sklearn库中的ShuffleSplit()函数和StratifiedShuffleSplit()函数的讲解 目录 sklearn库中的ShuffleSplit()函数和St ...

  4. Sklearn:sklearn.preprocessing之StandardScaler 的transform()函数和fit_transform()函数清晰讲解及其案例应用

    Sklearn:sklearn.preprocessing之StandardScaler 的transform()函数和fit_transform()函数清晰讲解及其案例应用 目录 sklearn.p ...

  5. python3 next_对Python 3.2 迭代器的next函数实例讲解

    在python中,使用iter函数可以获得有序聚合类型的迭代器,我个人将迭代器理解为带有next指针的单向链表,获取到的迭代器为链表的表头,表头内容为空,next指针指向有序聚合类型的第一个元素.在访 ...

  6. 浅析epoll – epoll函数深入讲解

    前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要是分析epoll的函数,epoll高性能的深入分析. epoll的三大函数 1.创建epoll fd函数 int epo ...

  7. 【C语言】strlen函数的讲解和模拟实现

    文章目录 strlen函数的讲解 strlen函数的模拟实现 计数器方式 递归的方式 指针减指针的方式 strlen函数的讲解 strlen函数我们应该不陌生,它可以帮助我们求字符串的长度(不包括'\ ...

  8. java trunc函数_Oracle常用函数Trunc及Trunc函数用法讲解

    1. Trunc( date) trunc 以指定的元素截取日期类型的数据 语法:trunc(date,[ format]) date– 日期格式的值 format–日期格式 如'mm','yyyy' ...

  9. php explode用法,PHP explode()函数用法讲解

    PHP explode()函数用法讲解 PHP explode() 函数 实例 把字符串打散为数组: 定义和用法 explode()函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组. 注释 ...

  10. python中append函数什么意思_python中append函数用法讲解

    python中append函数用法讲解 如果在做一个地区的统计工作,可以使用列表来帮助我们.输入汉字或者其他字符,比如"01代表汉族",那么在写民族的时候有下拉列表,就可以打01, ...

最新文章

  1. redis 集合操作
  2. 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
  3. ubuntu14.04、CentOS安装oracle 11g数据库【转载】
  4. 纯虚函数能为private吗?
  5. Docker学习笔记 - Docker Compose
  6. 改变centos系统的时区
  7. WordPress基础教学:绝对必装的JetPack外挂
  8. IntellIJ IDEA 配置 Vue 支持
  9. java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档
  10. 寻找安全漏洞?谨慎为之
  11. Spring MVC 起步
  12. Windbg命令学习9,经典死锁(!cs和~~[TID])
  13. 《人工智能及其应用》1-6章
  14. AutoPlay Menu Builder入门教程
  15. 网络流——基础,Dinic和Sap(Gap优化)算法
  16. 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践读后感
  17. 2020年度个人总结--一个前端技术LD的年终盘点
  18. CART与ID3的区别C4.5离散化的过程
  19. 5分钟了解赴港上市公司CEO薪酬
  20. 本地代码上传到gitlab

热门文章

  1. 地下城与勇士正在自动连接频道服务器,地下城与勇士DNF进不去提示“正在连接服务器”解决方案...
  2. trivial、standard layout、POD和literal类型解析
  3. Python实现qq自动发送消息
  4. 计算机主机usb端口使用不了,电脑usb接口不能用怎么办
  5. pentaho report designer笔记
  6. FutureTask 中 get(timeout) 的超时是怎么玩的?
  7. 什么因素影响无刷马达绕线机的精度
  8. 用显卡测试软件蓝屏,简单几步解决w10更新显卡驱动后重启蓝屏的问题
  9. LeetCode简单题之三除数
  10. 【老九学堂】【初识C语言】编译过程