1.引出句柄

CDC问题:
1.CDC dc;dc.LineTo(point);无法运行

2.CDC *dc=GetDC();dc->LineTo(point);就可以运行了

MFC中有大量的句柄包装类。所谓句柄包装类,指的是这些类是封装了系统对象的句柄,并提供了一组成员函数作为访问系统对象的接口。

从这些句柄包装类的意义上可以看出,一个被完全构造好,处于良好状态的MFC对象,其中的句柄成员必须是有效的,才能正常使用那些成员函数来操作这个对象。

所以一般的MFC句柄包装类的构建要完成两个任务:

第一,创建一个句柄包装类对象。

第二,初始化其中的系统对象句柄。

大部分的包装类对象的构建都通常分为两步进行:

1、创建一个对象;

2、通过create等类似的成员函数创建系统对象并初始化对象中的句柄。

当然这两部分也可以直接在构造函数中完成。此时一般需要一个系统对象句柄作为参数,或者另一个被良好构造的句柄包装类对象做参数,以在构造函数中就能初始化句柄成员。其他方法还有通过Attach和Detach将部

分构造的对象和系统对象句柄绑定,或通过FromHandle获得一个临时的句柄包装类对象等。

现在问题就很清晰了:

CDC dc;dc.LineTo( point );//无法运行,是因为dc这个对象仅仅被部分构建,其中的系统对象句柄成员并没有赋值为一个有效的绘图设备句柄,自然其后的LineTo调用就会失败。

而:

CDC *dc = GetDC();dc->LineTo( point );/*通过调用窗口类的GetDC()成员函数,将返回一个被良好构造的CDC对象(即该对象中的设备句柄成员已经被赋值为一个有效的

句柄),所以其后的LineTo操作就没问题。也就是问题的关键不在于对象创建于栈还是堆中,而在于是否完全构造好了一个句柄包装

类对象。*/

2.句柄到底是什么东东呢,指针呢?

  其实,句柄并没有什么神奇之处,不管哪种句柄,实际都是一个整数。它标识一种资源,如窗口、位图等等。就象你找一个人,必须知道它的地址一样,如果你要操作一种资源,必须先获得句柄。“取窗口句柄

()”并不是只能取出窗口的句柄,所有窗口控件,如编辑框、标签等都可以用本命令取出自己的句柄,如:编辑框1.取窗口句柄()或标签1.取窗口句柄()。控件的句柄同样,任何控件都有它自身的特有属性,句柄

也就指它的特有属性(包括共性)。

  句柄英文译作HANDLE,HANDLE的本意是把柄,把手的意思,是与操作系统打交道的东东。有人举过比较通俗的例子:你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指

定的,你无法自选。有了这个号码(学生证,假设一证多用)享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等 等。但你不能到食堂里买啤酒,因为学校不允许这种服务。而在计算机中系统

提供的服务就是API调用了。当你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄

只能调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对

象,这个句柄不是由程序员赋给的。

可以引用csdn上一个人的话来说明句柄,指针对象实例之间的关系:

牧童遥指杏花村。牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例。

3.深入探讨句柄

  更透彻的说,句柄是一种指向指针的指针。大家都知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随

时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境 下,Windows内存管理器经常在内存中来回移动对象,依此来

满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应

用对象在内存中的地址变化,而这个地址(存储单元的位置)本 身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地

知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定) ─→记载着对象在内存中的地址─→对象在内存中的地址(不稳定) ─→实际

对象

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 但是

必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看 成是一个应用程序的启动运行,那么系统给应用程序分配

的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

MFC中的句柄的更多相关文章

  1. MFC中获取各个窗口之间的句柄或者指针对象的方法

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  2. 互斥对象 Mutex 和MFC中的CMutex

    互斥(Mutex)是一种用途非常广泛的内核对象.能够保证多个线程对同一共享资源的互斥访问.同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共 ...

  3. MFC中消息响应机制

    由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的 ...

  4. MFC中树控件CTreeCtrl的用法

    树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点.MFC中使用CTreeCtrl类来封装树形控件的各种操作.通过调用 BOOL ...

  5. 多线程编程之二 ---MFC中的多线程开发

    下载源代码 五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消 ...

  6. MFC中菜单变灰的问题

    MFC中菜单变灰 方法1:有UpdateCmdUI句柄时 定义一个BOOL变量m_b来标志菜单项是否有效, 该菜单项响应UPDATE_COMMAND_UI消息,在消息处理函数中pCmdUI->E ...

  7. MFC中线程相关知识

    MFC中把线程分为两种类型,UI线程和工作者线程. MFC中启动一个线程的最好方法是调用AfxBeginThread,有两个版本,一个用于启动Ui线程,另外一个用于启动工作者线程.在MFC程序中,只有 ...

  8. MFC中用户自定义类响应自定义消息

    这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义 ...

  9. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

随机推荐

  1. java FileReader/FileWriter读写文件

    java FileReader/FileWriter读写字母和数字没问题,但读写汉字就乱码.记录下,后面找到解决方法再补上. public static void main(String[] args ...

  2. UIButton 标题靠右

    _classBtn =  [UIButton buttonWithType:UIButtonTypeCustom]; _classBtn.frame = CGRectMake(  kDeviceWid ...

  3. 一篇文章学会shell工具篇之sed

    sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫做流编辑器,在shell脚本和Makefile ...

  4. Shiro系列(0) - 权限管理在J2EE企业级开发中的应用与实战

    其实也是应大家要求,讲一下权限管理,之前有讲过,但是没有拿出来细讲,这次索性录了视频从头到尾把shiro讲一遍.后续spring security会另外找个时间也讲一下. 主要内容会包括以下 1.了解 ...

  5. 【Unity】3.2 利用预设(Prefab)制作可复用的组件

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源, ...

  6. java.lang.SecurityException:Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged

    转自:http://www.cnblogs.com/orientsun/archive/2012/11/04/2753270.html Error: java.lang.SecurityExcepti ...

  7. Java 虚拟机:互斥同步、锁优化及synchronized和volatile

    互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段.同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一 ...

  8. (转)Maven学习-处理资源文件

    转自:http://www.cnblogs.com/now-fighting/p/4888343.html 在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来, ...

  9. 【MyBean调试笔记】接口的使用和清理

    [DEMO信息] 有问题的DEMO, 由芒果提交 [问题描述] 双击Tab页面关闭页面和插件的时候出现AV异常 [问题调试] 我们在调试的时候出现这个错误时断点停在这里 可以看到停留在这个位置@Int ...

  10. 使用jquery提交FormData数据

    https://blog.csdn.net/u011500781/article/details/54931716 http://yunzhu.iteye.com/blog/2177923 ***** ...