Attach()函数和Detach()函数的作用

基本就是把一个句柄绑定和解绑定于一个类对象上,是其可以使用MFC的函数而不是API

首先,你要明白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一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。

时间: 2025-01-21 11:03:17

Attach()函数和Detach()函数的作用的相关文章

MFC Attach()函数和Detach()函数

一.Windows对象和MFC对象的区别?MFC对象实际上并没有把整个Windows对象都包装在其中.对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的.如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的:第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象

hamiltonians-什么事Hamiltonians函数,这个函数有什么作用?

问题描述 什么事Hamiltonians函数,这个函数有什么作用? 今天看论文的时候看到了Hamiltonians这个函数,上网找了一下,也没有具体点的回答,哪位大神指点下迷津,谢谢啦

编程-DrawEdge这个函数到底起了什么作用,为什么我没看到运行结果?

问题描述 DrawEdge这个函数到底起了什么作用,为什么我没看到运行结果? LineTo这个函数都可以画出一条线来,DrawEdge这个函数为什么就不能画出个矩形来? 能帮我修改代码实现一下么? 解决方案 在Lineto下drawedge前增加以下代码 rect.left=100; rect.right=200; rect.top=300; rect.bottom=400; 解决方案二: lprect = &rect rect未看到赋值引起的

线程-C++ thread的detach函数问题??

问题描述 C++ thread的detach函数问题?? #include<iostream> #include<thread> using namespace std; void function_1() { std::cout << "Hello,world!" << std::endl; } int main() { std::thread t1(function_1); //t1 starts running. //t1.join

多线程问题,中的sleep函数参数为0 的作用是什么 ?多线程问题,中的sleep函数

问题描述 多线程问题,中的sleep函数参数为0 的作用是什么 ?多线程问题,中的sleep函数 多线程问题,中的sleep函数参数为0 的作用是什么 ?多线程问题,中的sleep函数 解决方案 http://blog.csdn.net/lgstudyvc/article/details/9337063 解决方案二: 参数为零的调用的含义是当前线程自愿放弃CPU的竞争,便于操作系统进行新的CPU分配. 解决方案三: 参数为0表示主动调度一下,通常是一个线程需要等另外一个线程完成某个人物之后,自己

函数声明和函数表达式——函数声明的声明提前

定义函数的方法 定义函数的方法主要有三种:     函数声明(Function Declaration)     函数表达式Function Expression)     new Function构造函数 其中,经常使用的是函数声明和函数表达式的函数定义方法,这两种方法有着很微妙的区别和联系,而且这两种方法的使用也容易混淆,所以这篇文章主要总结下这两种函数定义方法的相关知识点,当然本文的主题依然是关于函数提前的. 函数声明的典型格式: function functionName(arg1, a

PL/SQL单行函数和组函数详解

函数|详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 组函数 本文将讨论如何利用单行函数以及使用规则. SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数.这些函数均可用于SELECT,WHERE.ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER

jQuery里filter()函数与find()函数用法分析

  本文实例讲述了jQuery里filter()函数与find()函数用法.分享给大家供大家参考.具体分析如下: $("div .cont"); 等价于$("div").find(".cont") filter()函数是作用在集合的每一个对象($(这里是什么得到的就是什么))上, find()函数是在每一个对象内部查找匹配表达式的子元素 例子: ? 1 2 <div class="cont"><p class

C++中的函数指针与函数对象的总结

以下是对C++中的函数指针与函数对象的使用进行了详细的分析介绍,需要的朋友可以参考下   篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表): 一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(