深入浅出MFC学习笔记第三章MFC六大关键技术之仿真类型识别动态创建Word格式.docx
- 文档编号:15311137
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:26
- 大小:23.06KB
深入浅出MFC学习笔记第三章MFC六大关键技术之仿真类型识别动态创建Word格式.docx
《深入浅出MFC学习笔记第三章MFC六大关键技术之仿真类型识别动态创建Word格式.docx》由会员分享,可在线阅读,更多相关《深入浅出MFC学习笔记第三章MFC六大关键技术之仿真类型识别动态创建Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
3{
4
5public:
6
7LPCSTRm_lpszClassName;
//对象所属类名
8
9Intm_nObjectSize;
//对象大小
10
11UINTm_wSchema;
//模式号
12
13CObject*(PASCAL*m_pfnCreateObject)();
//构建函数抽象类为NULL
14
15CRuntimeClass*pBaseClasss;
//基类CRuntimeClass对象指针。
16
17StaticCRuntimeClass*pFirstClass;
//链表头指针。
18
19CRuntimeClass*m_pNextClass;
//下一指针。
20
21};
MFC使用此类作为每个类的成员变量。
使用宏定义为每个类定义了自己的CRuntimeClass成员变量。
DECLAR_DYNAMIC和IMPLENMENT_DYNAMIC宏
使用这两个宏将CRuntimeClass对象不知不觉放到类之中。
DECLARE_DYNMIC宏定义如下:
22#defineDELCARE_DYNMIC(class_name)\
23
24public:
\
25
26staticCRuntimeClassclass##class_name\
27
28virtualCRuntimeClass*GetRuntimeClass()const;
##用来告诉编译器把两个字符串连接起来。
如果使用这个宏:
DELCARE_DYNMIC(CView);
那么预编译器将生成下列代码:
29public:
30
31staticCRuntimeClassclassCView;
32
33virtualCRuntimeClass*GetRuntimeClass()const;
以上代码仅仅是在类中定义CRuntimeClass对象,并定义一个返回CRuntimeClass对象地址的函数。
注意CRuntimeClass是static的,也就是说同一种类继承体系的对象共享一个CRuntimeClass对象。
初始化对象的内容以及建立类型型录表需要使用IMPLEMENT_DYNMIC宏。
34#defineIMPLEMENT_DYNMIC(class_name,base_class_name)\
35
36_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL);
37
38_IMPLEMENT_RUNTIMECLASS又是一个宏,它定义如下:
39
40#define_IMPLEMENT_RUNTIMECLASS(class_name,\
41
42base_class_name,wSchema,pfnNew)\
43
44staticchar_lpsz##class_name[]=#class_name;
45
46CRuntimeClassclass_name:
:
class##class_name=\
47
48{_lpsz##class_name,sizeof(class_name),\
49
50wSchema,pfnNew,\
51
52RUNTIME_CLASS(base_class_name),NULL\
53
54};
55
56staticAFX_CLASSINIT_init##class_name\
57
58(&
class_name:
class##class_name);
59
60CRuntimeClass*class_name:
GetRuntimeClass()const\
61
62{\
63
64return&
class_name:
class##classname;
65
66}
67
68#defineRUNTIME_CLASS(class_name)\
69
70(&
AFX_CLASSINIT是一个类,看着跟宏定义似的,这样做很容易让人迷惑。
它用于将本节点连接到类型型录表,定义如下:
71classAFX_CLASSINIT
72
73{
74
75public:
76
77AFX_CLASSINIT(CRuntimeClass*pNewClass)//构造函数
78
79{
80
81pNewClass->
m_pNextClass=CRuntime:
pFirstClass;
82
83CRuntimeClass:
pFirstClass=pNewClass;
84
85}
86
87};
用法:
88classCWnd:
publicCCmdTarget
89
90{
91
92public:
93
94DECLARE_DYNAMIC(CWnd);
95
96
97};
IMPLEMENT_DYNMIC(CWnd,CCmdTarget);
代码展开后为;
98classCWnd:
99
100{
101
102public:
103
104staticCRuntimeClassclassCView;
105
106virtualCRuntimeClass*GetRuntimeClass()const
107
108
109
110};
111
112
113
114staticchar_lpszCWnd[]="
CWnd"
;
115
116CRuntimeClassCWnd:
classCWnd=
117
118{
119
120_lpszCView,sizeof(CWnd),FFFF,NULL,&
Wnd:
classCWnd,NULL);
121
122};
123
124staticAFX_CLASSINIT_init_CWnd(&
CWnd:
classCWnd);
125
126{
127
128Return&
classCWnd;
129
130}
定义宏的过程很复杂,但是一旦定义好之后,在使用时仅仅两句话就可以完成定义CRuntimeClass对象并且连接类型型录链表的工作。
CObject是所有类的基类,也是链表的头,此类应特别定义,不能在CObject内使用定义好的宏。
131classCObject
132
133{
134
135public:
136
137virtualCRuntimeClass*GetRuntimeClass()const;
138
139staticCRuntimeClassclassCObject;
140
141};
142
143staticcharszCobject[]="
CObject"
144
145structCRuntimeClassCObject:
classCObject=
146
147{
148
149szCObject,sizeof(CObject),0xFFFF,NULL,NULL,NULL
150
151};
152
153staticAFX_CLASSINIT_init_CObject(&
Cobject:
classObject);
154
155CRuntimeClass*CObject:
GetRuntimeClass()const
156
157{
158
159return&
CObject:
classCObject;
160
161}
由于CRuntimeClass对象是static成员变量,因此需要在类外初始化。
如果忘记初始化将会报链接错误。
CRuntimeClass*CRuntimeClass:
:
pFirstClass=NULL;
建好了类类型路表,要实现IsKindOf功能很容易。
首先在CObject加上一个IsKindOf函数,于是所有继承自此类的类都具有类型识别的功能。
能够将某个CRuntimeClass对象与类类型型录中的元素进行比较。
如:
162classCObject
163
164{
165
166public:
167
168boolIsKindOf(constCRuntimeClass*pClass)const
169
170{
171
172CRuntimeClass*pClassThis=GetRuntimeClass();
173
174while(pClassThis)
175
176{
177
178if(pClassThis==pClass)
179
180returntrue;
181
182pClassThis=pClassThis->
m_pBaseClass;
//沿着基类寻找。
183
184}
185
186returnfalse;
187
188}
189
190};
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入浅出 MFC 学习 笔记 第三 六大 关键技术 仿真 类型 识别 动态 创建