MFC 编程 implement_dyncreate 怎么用?看这篇教程就对了!

吉云

今天搞定那个动态创建类的东西,就是用IMPLEMENT_DYNCREATE这个宏。一开始还真有点绕,不知道MFC里头是怎么让程序在跑的时候才知道要创建哪个类的对象的。

我遇到的情况是,需要根据一些运行时的信息,比如用户选个或者配置文件里写个来决定具体要 new 一个什么样的窗口或者视图对象出来。直接写死肯定不行,那也太傻,每次加个新类型都得改代码。

后来捣鼓半天,翻翻资料,发现MFC提供一套机制来干这事儿。关键就是两个宏:DECLARE_DYNCREATEIMPLEMENT_DYNCREATE

MFC 编程 implement_dyncreate 怎么用?看这篇教程就对了!

动手过程

实践起来不复杂,主要就两步:

  1. 在头文件里声明一下

    你得确保你的类是从CObject或者它的某个子类(比如CView, CDocument这些)继承下来的。这点很重要,不然那套机制用不。

    然后,打开你的类的头文件(就是那个.h文件),在类的声明里面,加上一句宏:

    MFC 编程 implement_dyncreate 怎么用?看这篇教程就对了!

    DECLARE_DYNCREATE(你的类名)

    比如我有个类叫 CMyCoolView,那就写 DECLARE_DYNCREATE(CMyCoolView)。就加在class CMyCoolView : public CView { ... }; 这个大括号里面,通常放在开头或者结尾都行,我习惯放前面。

  2. 在实现文件里实现一下

    光声明还不够,还得有具体的实现。这一步就要用到IMPLEMENT_DYNCREATE

    打开对应的源文件(就是那个.cpp文件),在文件的开头部分,注意不是在类的任何成员函数里面,就放在全局作用域那里,加上这句宏:

    MFC 编程 implement_dyncreate 怎么用?看这篇教程就对了!

    IMPLEMENT_DYNCREATE(你的类名, 它的基类名)

    接着上面的例子,如果我的 CMyCoolView 是从 CView 继承来的,那我就得这么写:

    IMPLEMENT_DYNCREATE(CMyCoolView, CView)

    这里要注意,第二个参数是你这个类的直接基类的名字。

MFC 编程 implement_dyncreate 怎么用?看这篇教程就对了!

结果

加上这两行宏之后,重新编译。成!

现在MFC的框架就能识别我的CMyCoolView类,并且能在需要的时候(比如通过文档模板)自动创建它的实例。感觉就像是给类贴个标签,告诉MFC:“这个类可以动态创建!”

虽然原理可能涉及到运行时类型信息(RTTI)什么的,但咱作为使用者,知道这两个宏怎么用,能解决问题就行。不得不说,MFC有时候虽然看着老旧,但这些宏确实省不少事儿,不用自己去搞工厂模式或者注册表之类的复杂玩意儿。

这回实践挺顺利的,搞懂DECLARE_DYNCREATEIMPLEMENT_DYNCREATE这一对儿搭档的用法,以后再需要动态创建MFC对象就知道怎么干。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]