MFC Object 和 Windows Object的含义

Window Object(Window对象)是Win32下用句柄表示的Windows操作系统对象。MFC Object(MFC对象)是C++对象,是C++类的实例,而且这里的MFC Object是指封装了Windows Object的C++对象,而不是任意的C++对象。

MFC Object 与 Windows Object的区别于联系

一个MFC窗口对象是C++ CWnd类(或派生类)的实例,是程序直接创建的。在程序运行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并为它分配资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在CWnd类的m_hWnd成员变量中。每一种Windows Object都有与之对应的MFC Object。

从数据结构上比较

MFC Object是相应的C++ 类的实例,这些类是由程序员或MFC定义的。

Windows Object是Windows系统内部的结构,通过一个句柄引用。

MFC给这些类定义一个成员变量来保存MFC Object对象的Windows Object的句柄。对于CDC类,将会保存两个HDC句柄。m_hDC,m_hAttribDC,它们都是Windows设备描述表句柄。CDC的成员函数作输出操作时,使用m_Hdc;要获取设备描述表的属性时,使用m_hAttribDC。

在层次上比较

MFC Object是高层的,Windows Object是低层的

MFC Object封装了Windows Object的大部分功能或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32API,代替他的是引用相应的MFC Object的成员函数。

从创建上比较

MFC中使用这些MFC Object通常是先创建一个MFC Object实例,此时这个C++对象是空的,通过调用此MFC Object的成员函数创建一个Windows Object,此Windows Object的句柄将会被保存在此MFC Object的一个句柄成员变量里,此时此MFC Object才有意义。当然也可以在MFC Object的构造函数中调用成员函数创建Windows Object,这样直接创建MFC Object后其就会创建Windows Object。MFC 的GDI类就是这么做的(但是我们要知道MFC Object的创建和Windows Object创建这是两个不同的过程)。

从转换上比较

可以从一个MFC Object得到对应的Windows Object的句柄,一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。

可以从一个已存在的Windows Object创建一个MFC Object,一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。

CDC dc;
dc.Attach(hDC); //通过将hDc句柄与此CDC对象“联姻”,也就是想通过此CDC对象使用此hDc句柄标志的设备描述表 dc.Detach(); //"离婚",解除hDc句柄与此CDC对象的关联

在使用范围上比较

MFC Object对系统的其他进程来说是不可见的,而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以在其他进程中使用。

对同一个进程的线程来说,只能使用本线程创建的MFC Object,不能使用其他线程创建的MFC Object。

在销毁上比较

MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。

当然,可以在MFC Object的析构函数中完成对Windows Object的销毁。(但是要知道二者并不相同),GDI对象就是这么做的。

MFC Object 与 Windows Object的更多相关文章

  1. Object obj=new Object()的内存引用

    Object obj=new Object(); 一句很简单的代码,但是这里却设计Java栈,Java堆,java方法去三个最重要的内存区域之间的关联. 假设这句代码出现在方法体中. 1.Object ...

  2. host Object和native Object的区别

    Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global.Math:一些是在脚本运行环境中创建来使用的,如:Array.Boolean. ...

  3. Intent传递List和Object和List<Object>

    一.传递List 传递List<String>的方法 小技巧,List<object> 可以使用json 转为 List<string>,就可以使用 List< ...

  4. JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

    ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...

  5. iOS 杂笔-21(self.name = “object” 和 _name =”object” 有什么不同?)

    iOS 杂笔-21(self.name = "object" 和 _name ="object" 有什么不同?) 问题如题,这是考察对属性与变量的了解而已. s ...

  6. [Javascript] Object.freeze() vs Object.seal()

    let person = { firstName: "Zhentian", lastName: "Wan" }; /*Object.freeze() makes ...

  7. Java基础知识强化26(1):Object类之Object类的概述

    1.Object类 类Object是类层次结构的根类,每个类都使用 Object作为超类.所有对象(包括数组)都实现这个类的方法 每个类直接或者间接继承自Object类   2.Object类无参构造 ...

  8. Object.wait()与Object.notify()的用法

    http://www.cnblogs.com/xwdreamer/archive/2012/05/12/2496843.html 参考文献: object.wait()和object.notify() ...

  9. 遍历对象属性(for in、Object.keys、Object.getOwnProperty)

    js中几种遍历对象的方法,包括for in.Object.keys.Object.getOwnProperty,它们在使用场景方面各有不同. for in 主要用于遍历对象的可枚举属性,包括自有属性. ...

随机推荐

  1. 云原生的弹性 AI 训练系列之一:基于 AllReduce 的弹性分布式训练实践

    引言 随着模型规模和数据量的不断增大,分布式训练已经成为了工业界主流的 AI 模型训练方式.基于 Kubernetes 的 Kubeflow 项目,能够很好地承载分布式训练的工作负载,业已成为了云原生 ...

  2. P1149_火柴棒等式(JAVA语言)

    题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-90−9的拼法如图所示 ...

  3. matplotlib常规使用方法

    1,指定图片大小和像素 Python绘图问题:Matplotlib中指定图片大小和像素 2,绘图命令的基本架构及其属性设置 绘图与可视化 3,python基础语法(二)--- plt的一些函数使用 p ...

  4. Java例题_30 在已经排好序的数组中插入值

    1 /*30 [程序 30 插入数字] 2 题目:有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. 3 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插 ...

  5. docker部署nodejs项目应用

    之前笔者弄了一套nestjs项目放在自己服务器上,并用pm2管理进程. 现在要把pm2停止,尝试一下用docker容器,那么首先要安装docker 一.安装docker 由于笔者服务器的系统是cent ...

  6. maven中心仓库OSSRH使用简介

    目录 简介 为什么使用中心仓库 发布到中心仓库前的准备工作 使用OSSRH 使用Sonatype创建ticket 中央仓库中的组件要求 提供Javadoc 和源代码 使用GPG/PGP给文件签名 Me ...

  7. 整合一套高性能网关Kong

    前言 相信大家对Api网关都比较的熟悉,我们之前的文章也介绍过ASP.NET Core的网关Ocelot,也介绍过Spring Cloud Gateway.说到网关的主要功能,其实总结起来就两个字&q ...

  8. EFCore3.1+编写自定义的EF.Functions扩展方法

    前言 本文主要是讲解EF Core3.0+ 如何实现自定义的数据库扩展函数 虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密.. 这样的话 我们就需要自己扩展这些数据库函 ...

  9. C#中SQLite的使用及工具类

    目录 SQLite简介 存储类 亲和类型 引用System.Data.SQLite.dll 软件包分类 使用本机库预加载 常用部署包 工具类 参考资料 SQLite简介 SQLite是一款轻型的数据库 ...

  10. windows上phpstudy配置memcache

    原文   http://blog.csdn.net/ltx06/article/details/78588448   总的来说,分两步:同时安装memcached软件服务和安装php_memcache ...