CWnd::Attach

Attaches a Windows window to a CWnd object.

BOOL Attach(

   HWND hWndNew

);

Parameters

hWndNew

Specifies a handle to a Windows window.

一个概念:C++对象和Windows对象的差别(来自MSDN)

The window object is an object of the C++ CWnd class (or a derived class) that your program creates directly. It comes and goes in response to your program's constructor and destructor calls. The Windows window, on the
other hand, is an opaque handle to an internal Windows data structure that corresponds to a window and consumes system resources when present. A Windows window is identified by a "window handle" (HWND) and is created after the CWndobject
is created by a call to the Create member function of class CWnd. The window may be destroyed either by a program call or by a user's action. The window handle is stored in the window object's m_hWnd member
variable. The following figure shows the relationship between the C++ window object and the Windows window. Creating windows is discussed in Creating Windows. Destroying windows is discussed in Destroying
Window Objects

 

一段解说:

 

首先。你要明确Windows对象和C++对象的差别。

C++对象(即MFC类CWnd)实际上并没有把整个Windows对象都包装在当中,它仅仅是有一个窗体句柄。

(在MSDN上查看CWnd类的成员变量。确实仅仅有一个HWND
hWnd。成员函数有Attach()和Dettach()、Create()等)。

这个窗体句柄假设指向一个实际存在的窗体对象,那么这个C++对象就是有效的,否则这个MFC对象是空的。

假设你还不明确,请回顾一下。当我们使用MFC创建一个窗体时。是分两步进行的:

第一步,new一个CWnd对象。这一步是创建C++对象,可是当中的HWND还是非法的。由于相应的Windows对象还没有被创建出来;

第二步。调用CWnd的成员函数Create创建真正的Windows对象。同一时候,把先前创建的MFC的CWnd对象的HWND成员指向该窗体,这样才算创建完毕一个窗体。

而假设你是用SDK方式。那么仅仅要创建一个WNDCLASS结构,然后调用Create或者CreateEx就创建了一 个窗体。

      好,如今回答你的问题,你能够假设,如今你已经有了一个有效窗体句柄(指向(并标识)了一个详细的Windows window)。那么你想把这个窗体和一个CWnd对象关联起来怎么办?非常easy,用Attach:事实上就是让一个C++对象——CWnd对象的HWND成员等于这个窗体句柄。这就是Attach主要完毕的任务。 

     第二个。关于Detach。如前所述,WNDCLASS事实上和CWnd根本没有什么关系。它们之间仅仅是通过CWnd的成员HWND联系起来的。假设把 Attach看做“联姻”的话。那么Detach就是“离婚”了,通俗地说,就是切断一个CWnd对象和一个有效窗体的脐带。为什么要切断呢?由于 CWnd是C++的对象,C++的对象有一个生存期的概念,脱离了该对象的作用域,这个对象就要被销毁,可是Windows对象没有这个特点,当销毁 CWnd对象的时候。我们不一定希望WNDCLASS一起被销毁。那么在此之前。我们就先要把这个“脐带”剪断,以免“城门失火。殃及池鱼”。

一个代码演示样例:

                                theApp->m_pMainWnd->ShowWindow(SW_NORMAL);
        m_nStatus=0;
        srcWnd.Detach();
        Invalidate(    }
    CView::OnLButtonUp(nFlags, point);
}

 
总结:由于Detach()函数是CWnd对象来调用的,所以能够理解为一个内部空虚的C++对象在呼唤一个有模有样的Windows窗体。

CWnd::Attach()具体解释的更多相关文章

  1. CWnd与HWND的简单辨析

    今天在写一个小的网络应用,需要用到HWND类型的一个参数.而程序中有的“窗口操作句柄”只有一个CWnd类型的指针.这俩不都是“窗口句柄”么?而且反正都是地址直接转换使用如何?结果出现了调用失效的情况. ...

  2. AppBox升级进行时 - Attach陷阱(Entity Framework)

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. Attach方法 前面我们已经多次使用Attach方法,上一次使用Attach ...

  3. mfc subclasswindow attach setwindowlong使用区别

    1. CWnd::Attach BOOL Attach( HWND hWndNew ); 返回值:如果成功,则返回非零值:否则返回0. 参数: hWndNew 指定了Windows窗口的句柄. 说明: ...

  4. AppBox升级进行时 - Entity Framework的增删改查

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. Entity Framework新增数据 以新增用户为例,作为对比,先来看下使 ...

  5. MFC GDI绘图基础

    一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...

  6. 走出MFC子类化的迷宫

    走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW  MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...

  7. 深入解析MFC -- 句柄与对象的关系

    CWnd::FromHandlePermanent ——根据窗口句柄得到CWnd*指针 This function, unlike FromHandle, does not create tempor ...

  8. VC 调试技术与异常(错误)处理 VC 调试技术与异常(错误)处理

    调试技术与异常(错误)处理 (1)   转载自 52PK游戏论坛 跟踪与中间过程输出 也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的D ...

  9. Battery Charging Specification 1.2 中文详解 来源:www.chengxuyuans.com

    1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的检测.控制和报告机制,这些机制是USB2.0规范的扩展,用于专用 充电器(DCP).主机(SDP).hub(SDP ...

随机推荐

  1. Ubuntu安装CUDA9.2(不更新驱动)

    1.先装驱动,以为安装CUDA时安装最新驱动导致CUDA用不了 sudo apt-get install nvidia-396 2.参考这,安装好CUDA 9.2 https://developer. ...

  2. 2019-9-2-C#判断文件属于文本或二进制

    title author date CreateTime categories C#判断文件属于文本或二进制 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...

  3. vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据

    需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功. 过程出现的bug和问题: 1.使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载 ...

  4. 微信小程序注册使用流程

    新开发微信小程序使用流程:  平时使用小程序较多,但是具体注册流程简单记录下: 第一步:通过邮箱注册 第二步:在邮箱进行激活 注册后,在邮箱会收到激活信息提示.点击激活地址进行激活. 第三步:信息登记 ...

  5. JS创建和存储 cookie的一些方法

    在js中cookie的操作与存储及清除cookie都与时间有关,我们只要把cookie过期时间进行有效的设置我们就可以控制它的存储了,下面我来给大家总结一下js中cookie的一些使用技巧 创建和存储 ...

  6. java 用户注册登陆Demo

    一个用户注册登陆的系统,用到了MD5加密处理密码,实现了一个简单的数据库连接池connectionPool, 实现了注册,登陆,登陆之后修改用户信息等功能,非常适合初学者 一.准备工作 数据库:MyS ...

  7. 视频透雾原理加视频增强Retinex算法介绍

    (本文转自:http://www.syphong.cn/52-1.html#) 视频透雾原理加视频增强Retinex算法介绍 -上海凯视力成 钟建军 一. 视频增强的背景 视觉信息是人类获得外界信息的 ...

  8. 巧用having

    mysql学习教程参考:https://www.w3school.com.cn/sql/index.asp where 与 having实例运用参考:https://www.2cto.com/data ...

  9. MyBatis框架的文件配置

    第一步:log4j.properties的配置 原因:Mybatis的日志输出是依赖与log4j的,所以必须要配置 # Global logging configuration log4j.rootL ...

  10. Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)

    P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...