attach和detach
来源:互联网 发布:socket长连接 java 编辑:程序博客网 时间:2024/06/04 19:30
首先,要明白Windows对象和MFC对象的区别。MFC对象实际上并没有把整个Windows对象都包装在其中,它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的,第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象还没有被创建出来;第二步,调用CWnd的成员函数Create创建真正的Windows对象,同时,把先前创建的MFC的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一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。
Detach之后CMenu就释放了HMENU的控制权,析构的时候就不会销毁菜单句柄
eg:
CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 20, 20), this, 1234);
- attach和detach
- Attach、Detach和DeleteObject
- attach和detach
- Attach、Detach和DeleteObject
- Attach、Detach和DeleteObject
- Attach、Detach和DeleteObject
- Attach、Detach和DeleteObject
- attach和detach区别
- Attach()函数和Detach()函数
- GetOwner和Getparent,Attach和Detach
- 关于attach和detach的疑问
- 使用C# Detach和Attach 数据库
- MFC Attach()函数和Detach()函数
- Attach和Detach的简单说明
- MFC Attach()函数和Detach()函数
- #R_函数#attach()和detach()函数
- R语言中的attach()和detach()函数
- MFC Attach()函数和Detach()函数
- poj3630 字典树
- SOAP(4)
- CSS3垂直时间轴-Demo马航失联
- 黑马程序员-DOM(第四讲)
- Oracle GoldenGate 12c 新特性 Credential Store and USERIDALIAS
- attach和detach
- JAVA API接口提供注意事项
- struts2全局异常处理及配合log4j进行异常日志记录
- 微软今起停止对XP技术支持:影响2亿国内用户
- 最大子矩阵和
- 黑马程序员-DOM(第五讲)
- 【转】Python_使用ElementTree解析xml文件
- 黑马程序员-DOM(第六讲)
- 1002