天天看点

VS2010创建MFC基类 --- CFormView的派生类

前面做了一基于对话框的基类,详情见https://blog.csdn.net/yishang44/article/details/99680673。在做基于CFormView的基类时候进行了相似的操作。

//.h文件
class CBaseForm : public CFormView
{
	DECLARE_DYNCREATE(CBaseForm)

protected:
	//CBaseForm();           // protected constructor used by dynamic creation
	CBaseForm(LPCTSTR lpszTemplateName);
	CBaseForm(UINT nIDTemplate);
	
    //
    ………………………………
    /
};


//.cpp文件

IMPLEMENT_DYNCREATE(CBaseForm, CFormView)

CBaseForm::CBaseForm(LPCTSTR lpszTemplateName)
	:CFormView(lpszTemplateName)
{

}
CBaseForm::CBaseForm(UINT nIDTemplate)
	:CFormView(nIDTemplate)
{

}

   
    ……………………………………
   
           

本以为就结束了,没想到出了问题。问题如下图,IMPLEMENT_DYNCREATE宏出现问题。

VS2010创建MFC基类 --- CFormView的派生类

查看MFC中的源码,IMPLEMENT_DYNCREATE宏的实现细节

#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, NULL)

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
	CRuntimeClass* PASCAL class_name::_GetBaseClass() \
		{ return RUNTIME_CLASS(base_class_name); } \
	AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
		#class_name, sizeof(class class_name), wSchema, pfnNew, \
			&class_name::_GetBaseClass, NULL, class_init }; \
	CRuntimeClass* PASCAL class_name::GetThisClass() \
		{ return _RUNTIME_CLASS(class_name); } \
	CRuntimeClass* class_name::GetRuntimeClass() const \
		{ return _RUNTIME_CLASS(class_name); }
           

这里可以看到这里会动态创建一个CBaseForm对象。作为基类,是不应该存在具体对象的。这里需要修改宏为IMPLEMENT_DYNAMIC,与之对应的宏DECLARE_DYNAMIC。

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
	IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)
           

这里就没有动态创建CBaseForm对象了。