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


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值