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

简介: 一、Windows对象和MFC对象的区别?MFC对象实际上并没有把整个Windows对象都包装在其中。对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。
一、Windows对象和MFC对象的区别?
MFC对象实际上并没有把整个Windows对象都包装在其中。
对于窗口:MFC对象它只是有一个窗口句柄而已,这个窗口句柄如果指向一个实际存在的窗口对象(窗口对象,也就是WNDCLASS,是一个Windows对象),那么这个MFC对象就是有效的,否则这个MFC对象是空的。
如果你还不明白,请回忆一下,当我们使用MFC创建一个窗口时,是分两步进行的:
第一步,new一个CWnd对象,这一步是创建MFC对象,但是其中的HWND还是非法的,因为对应的Windows对象还没有被创建出来;
第二步,调用CWnd的成员函数Create创建真正的Windows对象,同时,把先前创建的MFC的CWnd对象的HWND成员指向该窗口,这样才算创建完毕一个窗口。
而如果你是用SDK方式,那么只要创建一个WNDCLASS结构,然后调用Create或者CreateEx就创建了一个窗口。 

 
二、Attach  Detach
【Attach】 假设你已经有了一个有效窗口句柄,那么你想把这个窗口和一个CWnd对象关联起来怎么办?很简单,用Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄。这就是Attach主要完成的任务。
  
【Detach】如前所述,WNDCLASS其实和CWnd根本没有什么关系。它们之间只是通过CWnd的成员HWND联系起来的。如果把Attach看做“联姻”的话,那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗口的脐带。为什么要切断呢?因为CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,但是Windows对象没有这个特点,当销毁CWnd对象的时候,我们不一定希望WNDCLASS一起被销毁,那么在此之前,我们就先要把这个“脐带”剪断,以免“城门失火,殃及池鱼”。

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

程序代码
      if (oldbmp != NULL)
      {
       wdc.SelectObject(oldbmp);
      }
      DeleteObject(bmp.Detach());  // bmp自定义的一个位图句柄
      
      HBITMAP hdib = CreateDIBSection(wdc.m_hDC,&m_bmi,DIB_RGB_COLORS,(void**)&m_pbyte,NULL,0);
      ASSERT(hdib);
      bmp.Attach(hdib);
目录
相关文章
|
23天前
|
机器学习/深度学习 存储 PyTorch
Pytorch中in-place操作相关错误解析及detach()方法说明
Pytorch中in-place操作相关错误解析及detach()方法说明
41 0
|
3月前
|
Linux API C++
C++ 11 使用detach()和join()函数使用的注意点
最近做项目的时候,使用了c++11的多线程,以前做项目都是使用微软提供的一些api,比如临界区、Mutex等来实现多线程,但是比如临界区这玩意只在windows下才有,linux是没有这个概念的,所以为了跨平台,c++11之后,就提供了多线程的支持。
20 0
|
4月前
|
Linux 编译器 C语言
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
47 0
|
10月前
Qt通过QProcess启动进程并传递命令行参数
Qt通过QProcess启动进程并传递命令行参数
450 0
|
12月前
|
Unix Linux
C 程序来演示 fork() 和 pipe()
fork() 用于创建子进程。此子进程是原始(父)进程的副本。它是在类Unix操作系统上创建进程的主要方法。
60 0
pthread_detach函数
指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程),其退出状态不由其他线程获取,而直接自己自动释放(自己清理掉PCB的残留资源)进程结束后,线程也会结束。网络、多线程服务器常用
gtk_init参数传递过程(草稿)
gtk_init参数传递过程(草稿)
56 0
|
安全 Windows
ShellExecute, WinExec, CreateProcess区别
ShellExecute  ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。   有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。
1898 0
|
数据库 网络协议 SQL