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_的构造函数完成的。

posted @ 2012-04-15 21:22  bill joy  阅读(209)  评论(0)    收藏  举报