DECLARE_DYNAMIC(CCmdTarget) /*展开的话*/ /* public: static CRuntimeClass classCCmdTarget; //声明一个CRuntimeClass的变量 virtual CRuntimeClass* GetRuntimeClass() const; //声明一个函数GetRuntimeClass返回一个CRuntimeClass* */ 1.2.2 IMPLEMENT_DYNAMIC 说明:此宏实现以下行为 初始化当前类的CRunt...
可以通过DECLARE_DYNAMIC()使用MFC模板基类。 DECLARE_DYNAMIC()是MFC中的一个宏,用于声明一个动态创建的类。它可以用于MFC模板基类,但需要满足一些条件。首先,模...
DECLARE_DYNAMIC:支持运行时类型识别(RTTI) 凡是支持动态创建的,一定支持RTTI。 #defineDECLARE_DYNCREATE(class_name) \DECLARE_DYNAMIC(class_name) \staticCObject*PASCAL CreateObject();#defineDECLARE_DYNAMIC(class_name) \protected: \staticCRuntimeClass*PASCAL _GetBaseClass(); \public: \staticconstCRuntim...
1. 首先有一个结构叫做CRuntimeClass. 里面存储了类型说明. 比如类名称.大小. 以及判断是否是父类... 2. 有一个宏叫做 DECLARE_DYNAMIC宏. 这个宏就是定义了一个 自己的一个CRuntimeClass 结构的成员.并且添加了一个获取自己这个成员的一个虚函数. 3. 实现宏IMPLEMENT_DYNAMIC 其实就是对DECLARE_DYNAMIC 中...
MFC关键技术之仿真(DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC) MFC.h 1. #ifndef __MFC_H_ #define __MFC_H_ #define BOOL int #define TRUE 1 #define FALSE 0 #define LPCSTR LPSTR typedef char* LPSTR; #define UINT int #define PASCAL _stdcall
DECLARE_DYNAMIC (class_name) \ staticCObject*PASCAL CreateObject(); 这个宏同样用在类声明中,它不但为类添加了class##class_name对象和GetRuntimeClass(),还为类加入了一个静态函数CreateObject,用来进行对象的动态创建。同样IMPLEMENT_DYNCREATE用来对上面添加的内容作定义和初始化工作。
在每个需要有RTTI能力的类设计中都要重复那十多行代码是一件乏味的事情,也容易出错,所以MFC用了两个宏代替这些工作,即DECLARE_DYNAMIC(类名)和IMPLEMENT_DYNAMIC(类名,基类名)。从这两个宏我们可以看出在MFC名类中的CRuntimeClass对象构造连接只有类名及基类名的不同!
DECLARE_DYNCREATE包含了DECLARE_DYNAMIC宏,DECLARE_SERIAL包含了前两个宏,所以这三个宏是层层递进的关系。声明了DECLARE_SERIAL就相当于前两个就声明了。这些宏无非是定义了一些类和函数,同时使用相当于这些函数重复声明了,会出错。
DECLARE_DYNAMIC(XXX) 宏展开后就有了我们想要的: public: static CRuntimeClass classXXX //XXX为类名 virtual CRuntime* GetRuntimeClass() const; 对于IMPLEMENT_DYNAMIC(类名,基类名),看来也不值得在这里代换文字了,大家知道它是知道回事,宏展开后为我们做了什么,再深究真是一点意义都没有!
1)对使用IsKindOf这个函数的类要在.h文件夹里定义DECLARE_DYNAMIC或DECLARE_SERIAL宏 classCDlgTest:publicCDialog{DECLARE_DYNAMIC(CDlgTest)// Constructionpublic:// standard constructorCDlgTest(CWnd*pParent=NULL);...}; 2)需要在.cpp文件中加入IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL宏 IMPLEMENT...