/*在定义CRuntimeClass时候我把暂时不需要的属性去掉了,留下了必须的属性。主要思想利用两个宏 DECLARE_DYNAMIC 完成将定义的CRuntimeClass 嵌入到相应的类中。 IMPLEMENT_DYNAMIC 宏负责初始化,上面宏的定义。应该放到相应的CPP文件中,实质是上面宏在类外的实现。
AFX_CLASS_INIT 这个结构体的构造函数负责,连接整个RTTI网络。
宏定义中 \ 意思是紧接着下一行,没有空格。
*/
//mfx.h 主要是RTTI相关宏的定义
#include<Windows.h>
struct CRuntimeClass
{
LPCSTR m_pszClassName;
DWORD m_dwObjectSize;
CRuntimeClass* m_pBaseClass;
CRuntimeClass* m_pNextClass;
static CRuntimeClass* m_pFirstClass;
};
struct AFX_CLASS_INIT
{
AFX_CLASS_INIT(CRuntimeClass* pNewClass);
};
#define DECLEAR_DYNAMIC(class_name) \
public:\
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;
#define RUNTIME_CLASS(class_name) &(class_name::class##class_name)
#define IMPLEMENT_DYNAMIC(class_name,base_class_name) _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name)
#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name)\
CRuntimeClass class_name::class##class_name = {#class_name,sizeof(class_name),RUNTIME_CLASS(base_class_name),NULL};\
CRuntimeClass* class_name::GetRuntimeClass() const {return &(class_name::class##class_name);}\
struct AFX_CLASS_INIT init_##class_name( &class_name::class##class_name);
//======================================================mfx.cpp=========================================//
#include"mfx.h"
AFX_CLASS_INIT::AFX_CLASS_INIT(CRuntimeClass* pNewClass)
{
pNewClass ->m_pNextClass = CRuntimeClass::m_pFirstClass;
CRuntimeClass::m_pFirstClass = pNewClass;
}
CRuntimeClass* CRuntimeClass::m_pFirstClass = NULL;
//=============================================mfc.h====================================//
//自己定义MFC类
#ifndef _MY_FRAMEWORK_CWINAPP_H_
#define _MY_FRAMEWORK_CWINAPP_H_
#include"mfx.h"
#include<windows.h>
class CObject
{
//public operation
public:
CObject(){};
~CObject(){};
public:
static CRuntimeClass classCObject;
virtual CRuntimeClass* GetRuntimeClass() const;
};
class CCmdTarget: public CObject
{
public:
CCmdTarget() {};
~CCmdTarget() {};
DECLEAR_DYNAMIC(CCmdTarget)
public:
virtual BOOL IsKindOf(const CRuntimeClass* pBaseClass);
};
//IMPLEMENT_DYNAMIC(CCmdTarget,CObject)
class CWinThread: public CCmdTarget
{
public:
CWinThread() { };
~CWinThread() { };
public://operation
virtual BOOL InitInstance();
virtual INT Run();
DECLEAR_DYNAMIC(CWinThread)
};
class CWnd: public CCmdTarget
{
public:
CWnd() {};
~CWnd() {};
DECLEAR_DYNAMIC(CWnd)
};
//IMPLEMENT_DYNAMIC(CWnd,CCmdTarget)
class CWinApp: public CWinThread
{
public:
CWinApp() { m_pCurWinApp = this; };
~CWinApp() { };
public: //operation
virtual BOOL InitInstance();
virtual INT Run();
virtual BOOL InitApplication();
public://attributes
CWinApp* m_pCurWinApp;
CWnd* m_pMainWnd;
DECLEAR_DYNAMIC(CWinApp)
};
//IMPLEMENT_DYNAMIC(CWinApp,CWinThread)
class CFrameWnd: public CWnd
{
public:
CFrameWnd();
~CFrameWnd();
public:
virtual BOOL PreCreateWindow();
BOOL Create();
DECLEAR_DYNAMIC(CFrameWnd)
};
//============================globle function define===================================//
CWinApp* mfxGetWinApp();
#endif
//=====================================================mfc.cpp==============================================//
#include"MyWinApp.h"
extern CMyWinApp theApp;
CWinApp * mfxGetWinApp()
{
return theApp.m_pCurWinApp;
}
BOOL CWinThread::InitInstance()
{
return TRUE;
}
INT CWinThread::Run()
{
return 1;
}
BOOL CWinApp::InitInstance()
{
return TRUE;
}
INT CWinApp::Run()
{
return 1;
}
BOOL CWinApp::InitApplication()
{
return TRUE;
}
CFrameWnd::CFrameWnd()
{
}
CFrameWnd::~CFrameWnd()
{
}
BOOL CFrameWnd::PreCreateWindow()
{
return TRUE;
}
BOOL CFrameWnd::Create()
{
return TRUE;
}
///
IMPLEMENT_DYNAMIC(CCmdTarget,CObject)
IMPLEMENT_DYNAMIC(CWinThread,CCmdTarget)
IMPLEMENT_DYNAMIC(CWnd,CCmdTarget)
IMPLEMENT_DYNAMIC(CWinApp,CWinThread)
IMPLEMENT_DYNAMIC(CFrameWnd,CWnd)
CRuntimeClass CObject::classCObject = {"CObject",sizeof(CObject),NULL,NULL};
CRuntimeClass* CObject::GetRuntimeClass() const
{
return &classCObject;
}
BOOL CCmdTarget::IsKindOf( const CRuntimeClass* pBaseClass )
{
CRuntimeClass* pClass = GetRuntimeClass();
while(pClass !=NULL )
{
if(!strcmp(pClass->m_pszClassName,pBaseClass->m_pszClassName))
return TRUE;
else
pClass = pClass->m_pBaseClass;
}
return FALSE;
}
//========================================MyWinApp.h======================================//
#pragma once
#include "mfc.h"
class CMyWinApp :
public CWinApp
{
public:
CMyWinApp(void);
public:
virtual ~CMyWinApp(void);
virtual BOOL InitInstance();
DECLEAR_DYNAMIC(CMyWinApp);
};
//=====================================================MyWinApp.cpp===========================================//
#include "MyWinApp.h"
#include "MyFrameWnd.h"
CMyWinApp theApp;
CMyWinApp::CMyWinApp(void)
{
}
CMyWinApp::~CMyWinApp(void)
{
}
BOOL CMyWinApp::InitInstance()
{
m_pMainWnd = new CMyFrameWnd();
return TRUE;
}
IMPLEMENT_DYNAMIC(CMyWinApp,CWinApp);
//=================================================MyFrameWnd.h======================================//
#pragma once
#include "mfc.h"
class CMyFrameWnd :
public CFrameWnd
{
public:
CMyFrameWnd(void);
public:
virtual ~CMyFrameWnd(void);
DECLEAR_DYNAMIC(CMyFrameWnd)
};
//=================================================MyFrameWnd.cpp======================================//
#include "MyFrameWnd.h"
CMyFrameWnd::CMyFrameWnd(void)
{
Create();
}
CMyFrameWnd::~CMyFrameWnd(void)
{
}
IMPLEMENT_DYNAMIC(CMyFrameWnd,CFrameWnd)
//================================================WinMain.cpp========================================//
#include"mfc.h"
#include"MyWinApp.h"
#include<stdarg.h>
#include<iostream>
using namespace std;
void MessageBoxPrintf(char* pszCaputre,char* Format,...)
{
va_list vaList;//equal to Format + sizeof(FOrmat)
char szBuff[100];
memset(szBuff,0,sizeof(char)*100);
va_start(vaList,Format);
//vsPrintf 三个参数 buff,format,参数数组的指针,va_list类型的。这个函数
// 多用于实现多个参数的自定义函数
_vsnprintf(szBuff,100,Format,vaList);
va_end(vaList);
MessageBoxA(NULL,szBuff,pszCaputre,MB_OK);
}
void Print()
{
CRuntimeClass* pClassFirst = CRuntimeClass::m_pFirstClass;
while(pClassFirst != NULL)
{
cout<<pClassFirst->m_pszClassName<<endl;
cout<<pClassFirst->m_dwObjectSize<<endl;
cout<<pClassFirst->m_pBaseClass->m_pszClassName<<endl;
cout<<"====================================="<<endl;
pClassFirst = pClassFirst->m_pNextClass;
}
}
int main()
{
Print();
CWinApp* pWinApp = mfxGetWinApp();
CWinApp* pApp = pWinApp;
cout<< pApp->IsKindOf(RUNTIME_CLASS(CMyWinApp))<<endl;
system("pause");
return 0;
}