CRuntimeClass在MFC中定义为一个数据结构,在文件AFX.H中声明,它是用来串起MFC从CObject继承下来的所有类(相当于一根绳,只要你牵住绳的一头你就可以得到绳上的所有数据),你也可以把你自己写的类加入这根绳。
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;//这个类的名字
int m_nObjectSize;//类的大小
UINT m_wSchema; // 计划类的绳中数目大小
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class//支持动态创建
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif
// Operations
CObject* CreateObject();//支持动态创建
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;//判断是不是一个基类的子类
// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
// CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass; // 指向另一个类的CRuntimeClass结构的指针
};
也就是说每新建一个类我们都可以加入MFC的继承表中,就是每个类声明中加入一个CRuntimeClass但是这个数据结构中有很多成员变量和函数。而且在实现文件中也要加入一些成员变量和函数的初始化或者成员函数的定义工作,每个类都要这么做会花很多行代码。还好微软给我们定义了几个宏让我们可以很方便的把我们定义的类加入到MFC继承的大绳中去。
1、//这个宏在声明文件中出现
DECLEAR_DYNAMIC(classname) /
#define DECLARE_DYNAMIC(class_name) /
public: /
static CRuntimeClass class##class_name; / 在类中建立一个CRuntimeClass的结构
virtual CRuntimeClass* GetRuntimeClass() const; 在类中建立一个虚拟函数
2.//这个宏出现在实现文件中
IMPLEMENT_DYNAMIC /
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) /
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
而IMPLEMENT_RUNTIMECLASS宏的定义是
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) /
CRuntimeClass* PASCAL class_name::_GetBaseClass() /
{ return RUNTIME_CLASS(base_class_name); } /
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { /
#class_name, sizeof(class class_name), wSchema, pfnNew, /
&class_name::_GetBaseClass, NULL }; /
CRuntimeClass* class_name::GetRuntimeClass() const /
{ return RUNTIME_CLASS(class_name); } /
有了这个大网之后我们就可以判断一个类是不是另一个类的派生类.
为了在得到一个类名后可以创建一个该类对象,我们不以直接NEW出一个来,因为MFC不知道这是一个类,而CRUNTIMECLASS中可以加入一个构造函数,这样就可以支持动态创建一个已知类名的类的对象.
而MFC又提供给我们新的宏定义
在声明文件中需要DECLARE_DYNCREATE宏
#define DECLARE_DYNCREATE(class_name) /
DECLARE_DYNAMIC(class_name) /
static CObject* PASCAL CreateObject();//往类中加入一个函数
在定义文件中需加入另一个宏
#define IMPLEMENT_DYNCREATE(class_name, base_class_name) /
CObject* PASCAL class_name::CreateObject() /
{ return new class_name; } /
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, /
class_name::CreateObject)