cview类 public_《深入浅出MFC》第三章 MFC六大关键技术之仿真(二)

#defineDECLARE_DYNAMIC(class_name) \

public: \

static  CRuntimeClass  class##class_name; \

virtual  CRuntimeClass* GetRuntimeClass() const;

#defineIMPLEMENT_DYNAMIC(class_name, base_class_name) \

_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

#define_IMPLEMENT_RUNTIMECLASS(class_name, base_class_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); \

CRuntimeClass* class_name::GetRuntimeClass() const \

{ return &class_name::class##class_name; } \

#defineRUNTIME_CLASS(class_name) \

(&class_name::class##class_name)

这个结构只有一个构造函数,没有其它成员

struct AFX_CLASSINIT

{

AFX_CLASSINIT(CRuntimeClass* pNewClass);

};

AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)

{

pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;

CRuntimeClass::pFirstClass = pNewClass;

}

一个宏展开的例子:

//头文件.h中的CView声明

class CView : public CWnd

{

DECLARE_DYNAMIC(CView)

......

};

//实现代码的.cpp文件中的代码

IMPLEMENT_DYNAMIC(CView, CWnd)

编译器宏展开之后将生成以下代码:

.h中的代码

class CView : public CWnd

{

public:

static CRuntimeClass classCView;  //定义一个静态变量

virtual CRuntimeClass* GetRuntimeClass() const; //定义一个读上面变量的函数

......

};

.cpp中的代码

//先定义并初始化一个名字,这只是一个字符串

static char _lpszCView[] = "CView";

//类中的静态成员变量是需要初始化的,下面几行就是初始化动作

CRuntimeClass CView::classCView = {

_lpszCView, sizeof(CView), 0xFFFF, NULL,

&CWnd::classCWnd, NULL; }

static AFX_CLASSINIT _init_CView(&CView::classCView);

CRuntimeClass* CView::GetRuntimeClass() const

{return &CView::classCView;}

//而链表的头需要特别处理,所以要在在CObject类的声明和实现代码中进行

//in header file

class CObject

{

public:

virtual CRuntimeClass* GetRuntimeClass() const;

...

public:

static CRuntimeClass classCObject;

};

//in implement file

static char szCObject[]="CObject";

struct CRuntimeClass CObject::classCObject=

{szCObject,sizeof(CObject),0xFFFF,NULL,NULL,NULL};

static AFX_CLASSINIT _init_CObject(&CObject::classCObject);

CRuntimeClass* CObject::GetRuntimeClass const

{

return &CObject::classCObject;

}

//并且CRuntimeClass中的静态成员需要初始化

CRuntimeClass* CRuntimeClass::pFirstClass=NULL;

//这样,“类别型录”链表的头部就形成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值