深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc

深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc

ID:58846267

大小:111.00 KB

页数:20页

时间:2020-09-23

深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc_第1页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc_第2页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc_第3页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc_第4页
深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc_第5页
资源描述:

《深入浅出MFC学习笔记(第三章MFC六大关键技术之仿真类型识别,动态创建).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第三章:MFC六大关键技术之仿真:类型识别深入理解MFC的内部运行原理,是本次学习《深入浅出MFC》的主要目的。要模仿的六大技术包括:1:MFC程序的初始化过程。2:RTTI(Runtimetypeidentification)运行时类型识别。3:Dynamiccreation动态创建4:Persistence永久保存5:消息映射6:消息传递。RTTI(运行时类型识别)IsKindOf能够侦测某个对象是否属于某种类。即判断某一对象所属的类是否是父类或当前类;要达到动态类型识别的能力,必须在构建类继承体系时记录必要的信息,这被称为类

2、型型录表。MFC以链表的方式建立了此表。类型型录表的每个元素为CRuntimeClass类型,其定义为:[cpp]viewplaincopy1classCRuntimeClass23{45public:67LPCSTRm_lpszClassName;//对象所属类名89Intm_nObjectSize;//对象大小1011UINTm_wSchema;//模式号121CObject*(PASCAL*m_pfnCreateObject)();//构建函数抽象类为NULL23CRuntimeClass*pBaseClasss;//基类C

3、RuntimeClass对象指针。45StaticCRuntimeClass*pFirstClass;//链表头指针。67CRuntimeClass*m_pNextClass;//下一指针。89};MFC使用此类作为每个类的成员变量。使用宏定义为每个类定义了自己的CRuntimeClass成员变量。DECLAR_DYNAMIC和IMPLENMENT_DYNAMIC宏使用这两个宏将CRuntimeClass对象不知不觉放到类之中。DECLARE_DYNMIC宏定义如下:[cpp]viewplaincopy10#defineDELCA

4、RE_DYNMIC(class_name)1112public:1314staticCRuntimeClassclass##class_name1516virtualCRuntimeClass*GetRuntimeClass()const;##用来告诉编译器把两个字符串连接起来。如果使用这个宏:DELCARE_DYNMIC(CView);那么预编译器将生成下列代码:[cpp]viewplaincopy17public:1819staticCRuntimeClassclassCView;12virtualCRuntimeCla

5、ss*GetRuntimeClass()const;以上代码仅仅是在类中定义CRuntimeClass对象,并定义一个返回CRuntimeClass对象地址的函数。注意CRuntimeClass是static的,也就是说同一种类继承体系的对象共享一个CRuntimeClass对象。初始化对象的内容以及建立类型型录表需要使用IMPLEMENT_DYNMIC宏。[cpp]viewplaincopy3#defineIMPLEMENT_DYNMIC(class_name,base_class_name)45_IMPLEMENT_RUNT

6、IMECLASS(class_name,base_class_name,0xFFFF,NULL);67_IMPLEMENT_RUNTIMECLASS又是一个宏,它定义如下:89#define_IMPLEMENT_RUNTIMECLASS(class_name,1011base_class_name,wSchema,pfnNew)1213staticchar_lpsz##class_name[]=#class_name;1415CRuntimeClassclass_name::class##class_name=1617{_

7、lpsz##class_name,sizeof(class_name),1819wSchema,pfnNew,2021RUNTIME_CLASS(base_class_name),NULL2223};2425staticAFX_CLASSINIT_init##class_name2627(&class_name::class##class_name);281CRuntimeClass*class_name::GetRuntimeClass()const23{45return&class_name::class##cl

8、assname;67}89#defineRUNTIME_CLASS(class_name)1011(&class_name::class##class_name);AFX_CLASSINIT是一个类,看着跟宏定义似的,这样做很容易让人迷惑。它用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。