所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用。在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND。在Windows编程中,每一个窗口都是有窗口句柄标识的。但是,类CWnd的对象和窗口句柄之间的概念并不是等同的。CWnd对象的创建和销毁,是由类CWnd的构造函数和析构函数完成的,而Windows窗口是Windows内部的一种数据结构,它由类CWnd的Create成员函数创建,由析构函数销毁。除此之外,成员函数DestroyWindow可以销毁Windows窗口,而不会销毁CWnd对象。

一般情况下,他创建一个窗口需要两步:首先,调用类CWnd的构造函数,构造一个CWnd对象,然后调用CWnd的成员函数Create,创建窗口。当用户要关闭该窗口时,可以销毁与窗口有关的CWnd对象,或者调用CWnd对象的成员函数DestoryWindow,删除窗口并销毁其数据结构。

HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。

CWnd是MFC类库中所有窗口类的基类。在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封保存了窗口句柄即在m_hWnd成员。

1.由一个HWND变量hWnd实例化一个CWnd*对象:

CWnd *pWnd;  HWND hWnd;

得到hWnd的方式:1.从参数获得   2.从CreateWindow(…..)返回

pWnd->Attach(hWnd);  //pWnd对象和窗口资源关联

用staticCWnd*   CWnd::FromHandle(HWND   hWnd) ;

如果一个CWnd对象没有和这个hWnd绑定,一个临时的CWnd对象将被构造,并且和hWnd绑定。如果绑定了就不是一个临时CWnd对象。返回的这个指针可能是临时的,所以最好不要保存用于后来使用。

用staticCWnd*   CWnd::FromHandlePermanent(HWND   hWnd);

如果CWnd对象没有和hWnd绑定,返回NULL,而不会构造一个临时对象。

2.由CWnd获取HWnd

CWnd的一个成员m_hWnd就是其所对应窗口的句柄:hWnd = pWnd->m_hWnd;

用hWnd = pWnd->GetSafeHwnd() 比pWnd->m_hWnd 安全,因为:

因为前者在 pWnd == NULL 的时候返回 NULL 不易察觉,而后者出现 access violation。

1.      获得父窗体的控件或子窗体的“窗口句柄—hWnd”

HWND hWnd = ::GetDlgItem(this->m_hWnd,IDC_XXXX_SIZE);  //参数1:父窗口的句柄

CWnd *CWnd::GetDlgItem( int nID );  // 返回控件/子窗体对象

void GetDlgItem( int nID, HWND*phWnd );  //获得控件/子窗体的句柄

总结:综上可知在MFC概念下,hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口;在SDK下hWnd原本就是用来代表一个窗口。hWnd在SDK和MFC概念都是一致的。而CWnd类是MFC将除了hWnd外的其它许多属性和操作进行封装的结果。

补充:

MFC中的每一个窗口类型(从CWnd直接/间接派生)对象fromWnd,在实例化之前,其

fromWnd.m_hWnd必定为NULL。

CButton button;  //此时button.m_hWnd ==NULL

button.Create(“按钮”,BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,

CRect(0,0,100,50),this,123); //此时button.m_hWnd != NULL

根据这个特点可以在动态控件的创建过程检测控件对象是否实例化,以避免重复/没有实例化。

http://blog.csdn.net/qq2399431200/article/details/10997461

CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)的更多相关文章

  1. java的局部变量和成员变量以及区别

    一.局部变量 存在某个方法中的变量就叫局部变量,局部变量一旦声明就必须赋值 否则不能使用 代码如下: class Person { String name; char sex; int age; pu ...

  2. 成员变量和属性区别(@property那点事儿)

    历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...

  3. Java中Static关键字详解以及静态变量和成员变量的区别

    一.static关键字的特点 (1)修饰成员变量.成员方法(2)随着类的加载而加载(3)优先于对象存在(4)被所有对象共享(5)可以通过类名调用 它本身也可以通过对象名调用 例如:main()方法由j ...

  4. (转)CWnd与HWND的区别与转换

    一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念.   CWnd是M ...

  5. CWnd与HWND的区别与转换

    CWnd与HWND的区别与转换 2011-10-20 10:29:30|  分类: VC学习库|字号 订阅     一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是 ...

  6. C#自定义属性(跟成员变量的区别)

    属性声明 public int age { get; set; } 从功能上等价于 private int m_age; public int age {get { return m_age; }se ...

  7. iOS中属性与成员变量的区别

    一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfa ...

  8. IOS 杂笔-4(属性与成员变量的区别)

    属性可以用点语法,比如self.xxx,在外部调用也同样可以someClass.xxx. 属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员 ...

  9. java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

    1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中 ...

随机推荐

  1. Database Vault注冊

    默认情况下,在安装好Database Vault组件的Oracle HOme下创建的数据库是没有注冊Database Vault的. 1)停EM.监听.数据库 2)启用Database Vault 在 ...

  2. uiwebview的常用属性1-故事版

  3. 调用cordova相关插件进行消息推送(通知栏提醒、响铃、震动)

    原文:调用cordova相关插件进行消息推送(通知栏提醒.响铃.震动) 版权声明:本文为博主原创文章,转载须注明出处,博客地址:https://blog.csdn.net/wx13227855087 ...

  4. ubuntu 16.0.4 中docker 部署 sqlserver 2017(四)

    1. 从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像 sudo docker pull mcr.microsoft.com/mssql/server:2017- ...

  5. 【非常高%】【codeforces 733B】Parade

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. Python 第三方库的安装

    1. pip 进入命令行,使用 pip install pip install numpy 2. 含有 setup.py 文件的第三方库 切换到 setup.py 所在的目录: python setu ...

  7. 【28.57%】【codeforces 711E】ZS and The Birthday Paradox

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. Entity Framework知识小总结

    什么是Entity Framework EF是微软主推的数据存取技术,在实际开发中,现在通常使用EF来构建应用程序的数据存取层,它是一个开源的“对象/关系映射(ORM:Object Relationa ...

  9. ajax的跨域请求问题:减少options请求

    服务器端在Response Headers里添加字段Access-Control-Max-Age: 86400 , "Access-Control-Max-Age"表明在86400 ...

  10. Android中去掉标题的方法总结

    方法一:也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码: requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标 ...