Attach and Detach in VC
原文地址:http://hi.baidu.com/hacknothack/blog/item/554c3c333ba0c1ff1b4cff7c.html
首先,要明白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一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。
CWnd* pWnd = new CWnd;
pWnd->Create(_T("STATIC"), "Hi", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 20, 20), this, 1234);
原文地址:http://www.winu.cn/ask/question.php?qid=17036
CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄,(包括窗口句柄,DC句柄,线程句柄等)。 m_hWnd m_hDC m_hThread 如果这些类对象的这些句柄为空,就表示无效对象。比如你 CWnd * pWnd = new CWnd,执行是合法的,但是没有Create就没有窗口句柄,基本上就是一个无效对象,只是系统内存申请了内存分配空间而已,很多操作都无法执行(debug模式下会出现断言错误窗口)。但是,假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是Valid的了。你可能跟踪看看Attach的实现,其实就是给m_hxxx赋值,而Detach就是值复位。这2个操作没有申请内存释放内存操作,就是一个赋值而已,是不是成对使用看你代码的实际情况吧。只要理解了这2函数的意义就行了 其实CWnd,CDC等类就是多了一个包装,方便用户(程序开发者)使用,如果用SDK开发,完全可以实现一样的功能。 句柄是操作系统内核对象,而窗口指针、DC指针是用户对象(由你的程序管理)。
Attach and Detach in VC相关推荐
- Attach、Detach和DeleteObject
原文:Attach.Detach和DeleteObject ,想飞的梦想 1.CWnd Attatch和Detach的关系 首先,要明白Windows对象和MFC对象的区别. MFC对象实际上并没有把 ...
- [转] Attach、Detach和DeleteObject
原文:Attach.Detach和DeleteObject ,想飞的梦想 1.CWnd Attatch和Detach的关系 首先,要明白Windows对象和MFC对象的区别. MFC对象实际上并没有把 ...
- attach()与detach()的使用
attach()与detach()需要配对使用,如果使用了attach而未使用detach,再次使用attach时,会有"对象被屏蔽"的问题,如下: 转载于:https://www ...
- docker container的attach和detach模式
docker container 容器运行的attach和detach模式 attach模式 docker run nginx 类似运行于前台的进程,会占据本地的STDIN和STDOUT detach ...
- VC中的Attach和Detach
CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是 句柄, (包括窗口句柄,DC句柄,线程句柄等). m_hWnd m_hDC ...
- Attach()和Detach()函数
一.Windows对象和MFC对象的区别? MFC对象实际上并没有把整个Windows对象都包装在其中. 对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口 ...
- My Lead route attach and detach issue
Created by Wang, Jerry on Jun 01, 2015 鼠标移动时,会产生大量的log 如果注释掉detach,listener 会越来越多.每次点击一个lead都会在liste ...
- attach和detach区别
函数attach()可以直接访问数据框的列,而无须添加相应的数据框名 detach可以禁止访问数据库的列
- 关于attach和detach的疑问
attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉. 如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋. ...
- R语言中的attach()与detach()
R语言中的attach()与detach() 我是学习R语言的新手,新手嘛只能做一只搬运知识的小蚂蚁,但我也是一只认真的小蚂蚁,所有的分享都是在自己遇到的问题基础上,结合前人的学习自己总结过的.这是我 ...
最新文章
- IE调试网页之一:F12 开发人员工具简介
- 学习强制删除正在运行的文件
- ModuleNotFoundError: No module named 'mpl_toolkits.basemap'
- Nginx模块开发中使用PCRE正则表达式匹配
- php简单的mysql类_超简单php mysql数据库查询类
- linux c之gcc -g file.c -o file提示warning: no newline at end of file
- [AGC031E] Snuke the Phantom Thief(网络流)
- 主机不支持php5.4,GoDaddy Linux主机不再支持PHP5.3版本 | Godaddy美国主机中文指南
- python爬虫验证码的识别_Python爬虫识别验证码
- redis-数据操作-键命令
- pytorch,onnx和tensorrt 的速度对比
- ES中文分词器-ik分词器安装
- 记kali下使用metasploit木马进行远程控制
- 服务器发送 微信通知,方糖,使用微信通知的小接口
- 按键消抖(并联0.1uf电容)
- php 微信 公众 平台,微信公众平台代码详解-php语言(一)
- Tasteless challenges hard WP
- 得了胆囊息肉对人体的危害大不大?
- 免费范文网复制内容-百味书屋
- 百万富翁问题--安全多方计算