今天搞定那个动态创建类的东西,就是用IMPLEMENT_DYNCREATE
这个宏。一开始还真有点绕,不知道MFC里头是怎么让程序在跑的时候才知道要创建哪个类的对象的。
我遇到的情况是,需要根据一些运行时的信息,比如用户选个或者配置文件里写个来决定具体要 new 一个什么样的窗口或者视图对象出来。直接写死肯定不行,那也太傻,每次加个新类型都得改代码。
后来捣鼓半天,翻翻资料,发现MFC提供一套机制来干这事儿。关键就是两个宏:DECLARE_DYNCREATE
和 IMPLEMENT_DYNCREATE
。
动手过程
实践起来不复杂,主要就两步:
- 在头文件里声明一下
你得确保你的类是从
CObject
或者它的某个子类(比如CView
,CDocument
这些)继承下来的。这点很重要,不然那套机制用不。然后,打开你的类的头文件(就是那个
.h
文件),在类的声明里面,加上一句宏:DECLARE_DYNCREATE(你的类名)
比如我有个类叫
CMyCoolView
,那就写DECLARE_DYNCREATE(CMyCoolView)
。就加在class CMyCoolView : public CView { ... };
这个大括号里面,通常放在开头或者结尾都行,我习惯放前面。 - 在实现文件里实现一下
光声明还不够,还得有具体的实现。这一步就要用到
IMPLEMENT_DYNCREATE
。打开对应的源文件(就是那个
.cpp
文件),在文件的开头部分,注意不是在类的任何成员函数里面,就放在全局作用域那里,加上这句宏:IMPLEMENT_DYNCREATE(你的类名, 它的基类名)
接着上面的例子,如果我的
CMyCoolView
是从CView
继承来的,那我就得这么写:IMPLEMENT_DYNCREATE(CMyCoolView, CView)
这里要注意,第二个参数是你这个类的直接基类的名字。
结果
加上这两行宏之后,重新编译。成!
现在MFC的框架就能识别我的CMyCoolView
类,并且能在需要的时候(比如通过文档模板)自动创建它的实例。感觉就像是给类贴个标签,告诉MFC:“这个类可以动态创建!”
虽然原理可能涉及到运行时类型信息(RTTI)什么的,但咱作为使用者,知道这两个宏怎么用,能解决问题就行。不得不说,MFC有时候虽然看着老旧,但这些宏确实省不少事儿,不用自己去搞工厂模式或者注册表之类的复杂玩意儿。
这回实践挺顺利的,搞懂DECLARE_DYNCREATE
和IMPLEMENT_DYNCREATE
这一对儿搭档的用法,以后再需要动态创建MFC对象就知道怎么干。