CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)
所有控件类都是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对象的一个成员变量,代表与这个对象绑定的窗口)的更多相关文章
- java的局部变量和成员变量以及区别
一.局部变量 存在某个方法中的变量就叫局部变量,局部变量一旦声明就必须赋值 否则不能使用 代码如下: class Person { String name; char sex; int age; pu ...
- 成员变量和属性区别(@property那点事儿)
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- Java中Static关键字详解以及静态变量和成员变量的区别
一.static关键字的特点 (1)修饰成员变量.成员方法(2)随着类的加载而加载(3)优先于对象存在(4)被所有对象共享(5)可以通过类名调用 它本身也可以通过对象名调用 例如:main()方法由j ...
- (转)CWnd与HWND的区别与转换
一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念. CWnd是M ...
- CWnd与HWND的区别与转换
CWnd与HWND的区别与转换 2011-10-20 10:29:30| 分类: VC学习库|字号 订阅 一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是 ...
- C#自定义属性(跟成员变量的区别)
属性声明 public int age { get; set; } 从功能上等价于 private int m_age; public int age {get { return m_age; }se ...
- iOS中属性与成员变量的区别
一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interfa ...
- IOS 杂笔-4(属性与成员变量的区别)
属性可以用点语法,比如self.xxx,在外部调用也同样可以someClass.xxx. 属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员 ...
- java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定
1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中 ...
随机推荐
- Java堆/栈/常量池以及String的详细详解(转)------经典易懂系统
一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...
- SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)
项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 在这边有一篇比较好的文章,推荐给大家! Spring ...
- webpack单独构建scss文件与.vue组件里构建scss的一个坑
在入口main.js里构建scss是通过引入模块的方式 import './assets/_reset.scss'; import './assets/_flex.scss'; import './a ...
- AbsoluteLayout绝对布局
1.四大控制属性(单位都是dp): ①控制大小: android:layout_width:组件宽度 android:layout_height:组件高度 ②控制位置: android:layout_ ...
- linux下仅仅有rman备份集的异机不同文件夹恢复
昨天在客户那里做了一次rman异机的恢复,把生产库弄一份给測试库用,总库大概80G,总共花费了2个小时,当时客户的环境是windows 11.2.0.3,今天早晨在linux下又一次測试了一下,记录下 ...
- Linux input
Linux input 输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主 ...
- Android--MVP设计模式实践
MVP设计模式是android开发讨论的很火的一个话题,我对设计模式也有一些拙见,为了实践我的一些想法,我在我最新开发的产品中将我心目中的MVP设计模式进行了实践,最后得到了这样的架构. 特点:简单, ...
- Leetcode 242 Valid Anagram 字符串处理
字符串s和字符串t是否异构,就是统计两个字符串的a-z的字符数量是否一值 class Solution { public: bool isAnagram(string s, string t) { ] ...
- POCO文档翻译:POCO C++库入门指南
内容目录 介绍 Foundation库 XML库 Util库 Net库 将这些东西组合到一起 介绍 POCO C++库是一组开源C++类库的集合,它们简化及加速了用C++来开发以网络功能为核心的可移植 ...
- Apache和Tomcat的整合
1.web架构 首先上图,解释web通用架构 通常情况下分为三大块 : ★ Web server : 通常情况下由 Apache Http Server . IBM Http Server .I ...