深入浅出 MFC Dynamic Creation 动态创建

MFC.H


#pragma  once
#define BOOL     int 
#define TRUE      1
#define FALSE     0
#define LPCSTR  LPSTR
typedef char*   LPSTR;
#define UINT    int

#define  PASCAL _stdcall
 

 class CObject;

struct CRuntimeClass
{
  //属性
	LPCSTR m_lpszClassName;
	int m_nObjectSize;
	UINT m_wSchema;


	//定义一个函数指针  动态创建 准备
	CObject *( PASCAL * m_pfnCreateObject)();


	CRuntimeClass *m_pBaseClass;

	
	static  CRuntimeClass * pFirstClass;
	CRuntimeClass *m_pNextClass;


	
	//创建函数
	CObject *CreateObject();

	//静态函数   
	static CRuntimeClass *  PASCAL Load();
	 

};

struct AFX_CLASSINIT
{
	//声明构造函数
	 AFX_CLASSINIT(CRuntimeClass *pNewClass);
};

//获取  CRuntimeClass  对象的地址
#define RUNTIME_CLASS(class_name) \
	(&class_name::class##class_name)

//为类class_name  1、声明一个CRuntimeClass 对象          2、返回该对象指针的一个函数GetRuntimeClass
#define DECLARE_DYANMIC(class_name)\
public:\
	static CRuntimeClass class##class_name;\
    virtual CRuntimeClass* GetRuntimeClass() const;


//1、给CRuntimeClass赋初值   2、定义函数GetRuntimeClass    3、声明  AFX_CLASSINIT结构体对象(不在类内部) 作用是实现 链接
#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;    } \


 //作用  初始化 CRuntimeClass 对象,并且加入链表
#define  IMPLEMENT_DYNAMIC(class_name,base_class_name) \
	_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)



//增加了动态创建后,来实现这个
#define  DECLARE_DYNCREATE(class_name)\
	DECLARE_DYANMIC(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)



class CObject
{
 
public:
	virtual CRuntimeClass * GetRuntimeClass()const;
	static  CRuntimeClass  classCObject;
	BOOL IsKindOf(const CRuntimeClass *pClass) const;
	virtual void SayHello();
};

class CCmdTarget:public CObject
{
public:
	DECLARE_DYANMIC(CCmdTarget);   //相当于定义一个  CRuntimeCLass   对象 和一个函数
};

class CWinThread:public CCmdTarget
{
	DECLARE_DYANMIC(CWinThread);
public:
	virtual BOOL InitInstance();
	virtual int Run();
};

class CWnd;
class CWinApp:public CWinThread
{
	DECLARE_DYANMIC(CWinApp);
public:
	CWinApp * m_pCurrentWinApp;
	CWnd   *  m_pMainWnd;
public:
	CWinApp();
	virtual BOOL InitApplication();
	virtual BOOL InitInstance();
	virtual int Run();
};
class CDocument:public CCmdTarget
{
	DECLARE_DYANMIC(CDocument);
public:
	
};

class CWnd:public CCmdTarget
{
	DECLARE_DYNCREATE(CWnd);
public:
	CWnd();
	void SayHello();
	virtual BOOL Create();
	BOOL CreateEx();
	virtual BOOL PreCreateWindow();
};

class CFrameWnd:public CWnd
{
	DECLARE_DYNCREATE(CFrameWnd);
public:
	CFrameWnd();
	BOOL Create();
	virtual BOOL PreCreateWindow();
};
 
class CView:public CWnd
{
public:
	CView();
	void SayHello();
	DECLARE_DYNCREATE(CView);

};


CWinApp *AfxGetApp();
MFC.CPP

#include "stdafx.h"
#include "MFC.h"
#include "MY.h"
#include <iostream>
using namespace std;
//公共函数定义
CRuntimeClass*  CRuntimeClass::pFirstClass=NULL;

//定义构造函数
AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass)
{
   pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
   CRuntimeClass::pFirstClass=pNewClass;
}


//初始化 CObject

CRuntimeClass * CObject::GetRuntimeClass()const
{
	return &CObject::classCObject;
}


//返回 新创建的类指针
CObject *CRuntimeClass::CreateObject()
{
	if (m_pfnCreateObject==NULL)
	{
		 
 
		return NULL;
	}

	CObject *pObject=NULL;
	pObject=(*m_pfnCreateObject)();
	return pObject;
}


//输入 类名,返回该类名的 CRuntimeClass
CRuntimeClass *PASCAL CRuntimeClass::Load()
{
	char szClassName[64];
	CRuntimeClass *pClass;
	cout<<"Enter a class name... ";
	cin>>szClassName;

	for (pClass=pFirstClass;pClass!=NULL;pClass=pClass->m_pNextClass)
	{
		if (strcmp(szClassName,pClass->m_lpszClassName)==0)
		{
			return pClass;
		}
	}

	return NULL;


}

BOOL CObject::IsKindOf(const CRuntimeClass *pClass) const
{
	CRuntimeClass *pClassThis=GetRuntimeClass();
	while(pClassThis)
	{
		if (pClassThis==pClass)
		{
			return true;
		}
		pClassThis=pClassThis->m_pBaseClass;
	}

	return false;
}
void  CObject::SayHello()
{
	cout<<"Hello  CObject"<<endl;
}

static char szObject[]="classCObject";
 CRuntimeClass  CObject::classCObject=
{szObject,sizeof(CObject),0xffff,NULL,NULL,NULL};
 


//定义该结构体对象
static AFX_CLASSINIT  _init_CObject(&CObject::classCObject);



 BOOL CWinThread::InitInstance()
{
	cout<<"CWinThread::InitInstance"<<endl;
	return TRUE;
}
 int CWinThread::Run()
{
	cout<<"CWinThread::Run"<<endl;
	return 1;
}


CWinApp::CWinApp()
{
	m_pCurrentWinApp=this;
}
 BOOL CWinApp::InitApplication()
{
	cout<<"CWinApp::InitApplication"<<endl;
	return TRUE;
}
 BOOL CWinApp::InitInstance()
{
	cout<<"CWinApp::InitInstance"<<endl;
	return CWinThread::InitInstance();
}
 int CWinApp::Run()
{
	cout<<"CWinApp::Run"<<endl;
	return CWinThread::Run();
}


 BOOL CWnd::Create()
{
	cout<<"CWnd::Create()"<<endl;
	return TRUE;
}
 void CWnd::SayHello()
 {
	 cout<<"Hello   CWnd"<<endl;
 }
 CWnd::CWnd()
 {
	 cout<<"CWnd Constructor"<<endl;
 }

BOOL CWnd::CreateEx()
{
	PreCreateWindow();
	return TRUE;
}
 BOOL CWnd::PreCreateWindow()
{
	return TRUE;
}


 CFrameWnd::CFrameWnd()
 {
	 cout<<"CFrameWnd  Constructor"<<endl;
 }
BOOL CFrameWnd::Create()
{
	CreateEx();
	return TRUE;
}
 BOOL CFrameWnd::PreCreateWindow()
{
	cout<<"CFrameWnd::PreCreateWindow"<<endl;
	return TRUE;
}

 CView::CView()
 {
	 cout<<"CView Constructor"<<endl;
 }
 void CView::SayHello()
 {
	 cout<<"Hello CView"<<endl;
 }

 IMPLEMENT_DYNAMIC(CCmdTarget,CObject);
 IMPLEMENT_DYNAMIC(CWinThread,CCmdTarget);
 IMPLEMENT_DYNAMIC(CWinApp,CWinThread);

 IMPLEMENT_DYNAMIC(CDocument,CCmdTarget);
 

 IMPLEMENT_DYNCREATE(CWnd,CCmdTarget);
 IMPLEMENT_DYNCREATE(CFrameWnd,CWnd);


 IMPLEMENT_DYNAMIC(CView,CWnd);



 extern CMyWinApp theApp;
 CWinApp *AfxGetApp()
 {
	 return theApp.m_pCurrentWinApp;
 }


MY.H

#pragma  once

#include <iostream>
using namespace std;

#include "MFC.h"
class CMyWinApp:public CWinApp
{
public:
	virtual BOOL  InitInstance();
};

class CMyFrameWnd:public CFrameWnd
{
public:
		void SayHello();
	CMyFrameWnd();

   DECLARE_DYNCREATE(CMyFrameWnd);
  
};
class CMyDoc:public CDocument
{
public:
	void SayHello();
	DECLARE_DYNCREATE(CMyDoc);
};
class CMyView:public CView
{
  public:
     void SayHello();
	DECLARE_DYNCREATE(CMyView);
};
MY.CPP

#include "stdafx.h"
#include "MY.h"
#include "MFC.h"


BOOL  CMyWinApp::InitInstance()
{
	m_pMainWnd=new CFrameWnd;
	return TRUE;
}

CMyFrameWnd::CMyFrameWnd()
{
	cout<<"CMyFrameWnd Constructor"<<endl;
	Create();
}
void CMyFrameWnd::SayHello()
{
	cout<<"Hello CMyFrameWnd"<<endl;
}

void CMyDoc::SayHello()
{
	cout<<"Hello  CMyDoc"<<endl;
}
void CMyView::SayHello()
{
	cout<<"Hello CView"<<endl;
}
IMPLEMENT_DYNCREATE(CMyDoc,CDocument);
IMPLEMENT_DYNCREATE(CMyFrameWnd,CFrameWnd);
IMPLEMENT_DYNCREATE(CMyView,CView);

 
 
CMyWinApp  theApp;

MAIN.CPP
// Frame3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include "MY.h"

void printAllClasses()
{
	CRuntimeClass *pFirst=NULL;
	for (pFirst=CRuntimeClass::pFirstClass;pFirst;pFirst=pFirst->m_pNextClass)
	{
		cout<<"名字:"<<pFirst->m_lpszClassName;
		cout<<"    大小:"<<pFirst->m_nObjectSize<<endl;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{

	CWinApp *pApp=AfxGetApp();
	pApp->InitApplication();
	pApp->InitInstance();
	pApp->Run();

	printAllClasses();



	//CMyDoc *pDoc=new CMyDoc();
	//CMyView *pView=new CMyView();

	//cout<<pDoc->IsKindOf(RUNTIME_CLASS(CMyDoc))<<endl;
	//cout<<pDoc->IsKindOf(RUNTIME_CLASS(CDocument))<<endl;
	//cout<<pDoc->IsKindOf(RUNTIME_CLASS(CCmdTarget))<<endl;
	//cout<<pDoc->IsKindOf(RUNTIME_CLASS(CWinApp))<<endl;

	//cout<<pDoc->IsKindOf(RUNTIME_CLASS(CView))<<endl;


	//cout<<pView->IsKindOf(RUNTIME_CLASS(CView))<<endl;
	//cout<<pView->IsKindOf(RUNTIME_CLASS(CObject))<<endl;
	//cout<<pView->IsKindOf(RUNTIME_CLASS(CWnd))<<endl;
	//cout<<pView->IsKindOf(RUNTIME_CLASS(CFrameWnd))<<endl;

	CRuntimeClass *pClassRef;
	CObject *pOb;
	while(1)
	{
		if ((pClassRef=CRuntimeClass::Load())==NULL)
		{
			break;
		}
		pOb=pClassRef->CreateObject();
		if (pOb!=NULL)
		{
			pOb->SayHello();
		}
	}


	system("pause");
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值