Inside MFC: Handle Maps and Temporary Objects
### Inside MFC: Handle Maps and Temporary Objects #### 引言 在阅读MSDN文档时,我们经常遇到这样一句话:“返回的指针可能是临时的,不应存储以供以后使用。” 这句话背后的含义是什么?本文将深入探讨MFC(Microsoft Foundation Classes)中的句柄映射(handle maps)机制以及临时对象(temporary objects),解释这句话的具体含义,并介绍这些概念是如何帮助MFC实现统一的方法来从对应的C语言句柄获取C++对象的。 #### 基础概念回顾 ##### 什么是句柄? 当讨论与屏幕上任何图形窗口交互的Windows API时,它们通常会把一个`HWND`作为第一个参数。那么,`HWND`代表什么呢?顾名思义,`HWND`是一个指向某种称为`WND`的东西的句柄。`WND`是一个结构体,包含了操作系统需要的所有关于非屏幕窗口的信息(如位置、大小、标题、颜色等),以便能够唯一地标识该窗口。 ##### 句柄与MFC对象 在Windows编程中,句柄是操作系统用于标识内存中特定资源的标识符。MFC通过一系列机制,将这些句柄转换为C++对象,使得开发人员能够更加方便地操作这些资源。例如,对于一个窗口句柄(HWND),MFC提供了一个对应的C++类`CWnd`,该类封装了与窗口相关的所有操作。 ##### C++窗口对象与HWND的关系 在MFC中,每一个C++窗口对象都关联着一个窗口句柄。当创建一个新的窗口时,系统会分配一个唯一的句柄,并将其与创建的`CWnd`对象关联起来。这样,通过操作`CWnd`对象就可以间接地操作窗口句柄,实现了C++级别的抽象。 ##### new/delete vs create/destroy 在C++中,我们通常使用`new`和`delete`来管理对象的生命周期。然而,在MFC中,创建和销毁窗口等资源通常是通过调用特定的函数来完成的,例如`CreateWindow`和`DestroyWindow`。这是因为这些资源由操作系统管理,而不仅仅是普通的C++对象。 ##### attach/detach `attach`和`detach`方法允许将一个句柄与一个MFC对象关联或解除关联。这在某些情况下非常有用,例如在窗口被重新创建时,可以将新分配的句柄与现有对象关联,而不是创建新的对象。 #### 准备基础 为了更好地理解MFC如何实现句柄映射和临时对象的概念,我们需要了解以下几个关键组件: ##### CMemPtrToPtr `CMemPtrToPtr`是一个用于将内存地址转换为指向特定类型的指针的函数。这对于从句柄映射中检索到的对象非常重要。 ##### CRuntimeClass `CRuntimeClass`是一个用来描述运行时类信息的类。它存储了有关类的元数据,如类名、父类信息和对象大小等。这对于动态创建和识别对象类型至关重要。 #####CHandleMap `CHandleMap`是MFC中用于存储句柄到对象映射的数据结构。它提供了一种机制,可以在运行时查找给定句柄对应的对象。 ##### CHandleMap::FromHandle `CHandleMap::FromHandle`方法用于从句柄映射中根据给定句柄检索相应的C++对象。这是MFC内部实现句柄到对象转换的核心方法。 #### 深入探讨 下面我们将通过几个具体的例子来深入了解句柄映射和临时对象的工作原理。 ##### CWnd::GetFocus() `CWnd::GetFocus()`是一个常用的MFC方法,用于获取当前获得焦点的窗口。这个方法返回一个指向窗口对象的指针。但是,需要注意的是,这个指针可能是一个临时指针。这是因为`GetFocus()`实际上是从句柄映射中检索到的指针,该指针可能在下一次调用时变得无效。 ##### CWnd::FromHandle() `CWnd::FromHandle()`方法用于从给定的句柄中获取对应的`CWnd`对象。这同样是通过句柄映射实现的。需要注意的是,返回的指针也可能是一个临时指针,因为句柄映射中的对象可能会在之后的时刻发生变化。 ##### AFX_MAPHWND(BOOL bCreate) `AFX_MAPHWND`宏用于初始化句柄映射。当设置`bCreate`为`TRUE`时,它会在MFC中注册一个句柄映射。这意味着,对于每个窗口句柄,都会有一个对应的`CWnd`对象被创建并存储在映射中。 ##### 为什么返回的指针是临时的? 返回的指针之所以被称为临时的,是因为它们依赖于句柄映射中的当前状态。如果句柄映射中的对象被销毁或者句柄被重新关联到不同的对象上,那么原先返回的指针就会变得无效。因此,不建议将这些指针存储以供以后使用,除非采取额外措施确保其有效性。 #### 结论 通过对MFC中的句柄映射和临时对象的理解,我们可以更好地掌握MFC如何处理窗口句柄和其他资源。通过这些机制,MFC提供了一种更加安全和高效的方式来管理和操作这些资源,使得开发者能够更加专注于应用程序的逻辑而非底层细节。希望本文能帮助读者更深入地理解MFC的工作原理。
剩余22页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- LABVIEW程序实例-DS写数据.zip
- LABVIEW程序实例-DS写属性数据.zip
- LABVIEW程序实例-graph接受的数据类型.zip
- LABVIEW程序实例-TCP读数据.zip
- LABVIEW程序实例-Launch DS Server if Local URL.zip
- LABVIEW程序实例-web写数据.zip
- LABVIEW程序实例-TCP写数据.zip
- LABVIEW程序实例-web发布程序.zip
- LABVIEW程序实例-xy Graph.zip
- LABVIEW程序实例-按钮的机械动作.zip
- LABVIEW程序实例-While循环的先检查后执行.zip
- LABVIEW程序实例-保存二进制文件附加文件头2.zip
- LABVIEW程序实例-保存波形文件.zip
- LABVIEW程序实例-保存二进制文件附加文件头1.zip
- LABVIEW程序实例-保存二进制文件附加文件头3.zip
- LABVIEW程序实例-波形属性.zip