MFC 学习笔记一
通过近段时间的MFC学习,对消息机制有了更深入的理解,消息链的建立,RUNTIMECLASS的理解中,对于类的组织链的精妙设计很叹服,这些主要是在看MFC深入浅出的过程中体会到的,整个学习过程中,感觉记住MFC的类层次图是非常重要和必需的。下面就对自己所学习的RTTI(执行时期型别辨识)进行整理:
首先必须清楚这几个宏的定义:
DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏:
#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
#define IMPLEMENT_DYNAMIC(class_name,base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)
#define _IMPLEMENT_RUNTIMECLASS(class_name,base_classs_name,wSchema,pfnNew) \
static char _lpsz##class_name[] = #class_name; \
CRuntimeClass class_name::class##class_name = {\
_lpsz##class_name,sizeof(class_name),wSchema,pfnNew,\
RUNTIME_CLASS(base_class_name),NULL);\
static AFX_CLASSINIT init##class_name(&class_name::class##class_name);\
{ return &class_name::class##class_name;}\
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)
下面来看两个数据结构(以上已经出现的CRuntimeClass和AFX_CLASSINIT:
struct CRuntimeClass
{
//Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass* m_pBaseClass;
static CRuntimeClass* pFirstClass;
CRuntimeClass* m_pNextClass;
};
struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass* pNewClass);}
};
写到这里,发现了其实类别型录网的建立是一个CRuntimeClass链,而建立的过程是有AFX_的构造函数完成的。

浙公网安备 33010602011771号