FromHandlePermanent(HANDLE Windows_Object)
它是一个静态成员函数。如果该Windows对象没有永久地映射到一个MFC对象上,则返回NULL,否则返回对应的MFC对象。
AssertValid()
它是从CObject类继承来的虚拟函数。MFC覆盖该函数,实现了至少一个功能:判断当前MFC对象的指针this是否映射到一个对应的可靠的Windows对象。
图 9-9示意了MFC对映射结构的实现层次,对图9-9解释如下。

图中上面的虚线框表示使用映射关系的高层调用,包括上面讲述的几类函数。MFC和应用程序通过它们创建、销毁、使用映射关系。
图中中间的虚线框表示MFC使用CHandleMap类实现对映射关系的管理。一个CHandleMap对象可以通过两个成员变量来管理两种映射数据:临时映射和永久映射。模块-线程状态给每一类MFC对象分派一个CHandleMap对象来管理其映射数据(见模块-线程类的定义),例如m_pmapHWND所指对象用来保存CWnd对象(或派生类对象)和Windows window之间的映射。
下面的虚线框表示映射关系的最底层实现,MFC使用通用类CMapPtrToPtr来管理MFC对象指针和Windows句柄之间的映射数据。
对本节总结如下:
MFC的映射数据保存在模块-线程状态中,是线程和模块局部的。每个线程管理自己映射的数据,其他线程不能访问到本线程的映射数据,也就不允许使用本线程的MFC对象。
每一个MFC对象类(CWnd、CDC等)负责创建或者管理这类线程-模块状态的对应CHandleMap类对象。例如,CWnd::Attach创建一个永久性的映射保存在m_pmapHwnd所指对象中,如果m_pmapHand还没有创建,则使用AfxMapHWND创建相应的CHandleMap对象。
映射分两类:永久性的或者临时的。
临时对象的处理
在2.4节就曾经提到了临时对象,现在是深入了解它们的时候了。
临时对象指MFC对象,是MFC或者程序员使用FromHandle或者SelectObject等从一个Windows对象句柄创建的对应的MFC对象。
更多内容请看PCdog.com--Fireworks教程 PPT教程 电脑入门教程专题
