博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Attach函数的讲解
阅读量:3985 次
发布时间:2019-05-24

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

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的例子,不要计较代码的实现方法。

转载地址:http://kwxui.baihongyu.com/

你可能感兴趣的文章
剑指offer算法题分析与整理(一)
查看>>
剑指offer算法题分析与整理(二)
查看>>
剑指offer算法题分析与整理(三)
查看>>
剑指offer算法题分析与整理(四)
查看>>
剑指offer算法题分析与整理(五)
查看>>
部分笔试算法题整理
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
retext出现Could not parse file contents, check if you have the necessary module installed解决方案
查看>>
pyQt不同窗体间的值传递(一)——对话框关闭时返回值给主窗口
查看>>
linux mint下使用外部SMTP(如网易yeah.net)发邮件
查看>>
北京联通华为光猫HG8346R破解改桥接
查看>>
树莓派搭建可公网访问的服务器
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
一行代码搞定矩阵旋转——python
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>