现在的位置: 首页 > 综合 > 正文

MFC关键技术之仿真(DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC)

2013年09月21日 ⁄ 综合 ⁄ 共 4211字 ⁄ 字号 评论关闭
MFC.h
#ifndef __MFC_H_
#define __MFC_H_
#define BOOL int
#define TRUE 1
#define FALSE 0
#define LPCSTR LPSTR
typedef char* LPSTR;
#define UINT int
#define PASCAL _stdcall

#include <iostream>

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;
};

struct AFX_CLASSINIT {
	AFX_CLASSINIT(CRuntimeClass* pNewClass);
};


#define RUNTIME_CLASS(class_name) \
	(&class_name::class##class_name)


#define DECLARE_DYNAMIC(class_name) \
	public: \
	static CRuntimeClass class##class_name; \
	virtual CRuntimeClass* GetRuntimeClass() const;


#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; \
}

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
	_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0XFFFF, NULL)

class CObject {
public:
	CObject() {}
	~CObject() {}

	virtual CRuntimeClass* GetRuntimeClass() const;
	static  CRuntimeClass classCObject;
};

class CCmdTarget : public CObject {
	DECLARE_DYNAMIC(CCmdTarget)
public:
	CCmdTarget() {}
	~CCmdTarget() {}
};

class CWinThread : public CCmdTarget {
	DECLARE_DYNAMIC(CWinThread)
public:
	CWinThread() {}
	~CWinThread() {}
	virtual BOOL InitInstance() {
		return TRUE;
	}
	virtual int Run() {
		return 1;
	}
};

class CWnd;

class CWinApp : public CWinThread {
	DECLARE_DYNAMIC(CWinApp)
public:
	CWinApp* m_pCurrentWinApp;
	CWnd* m_pMainWnd;

public:
	CWinApp() {
		m_pCurrentWinApp = this;
	}
	~CWinApp() {}

	virtual BOOL InitApplication() {
		return TRUE;
	}
	virtual BOOL InitInstance() {
		return TRUE;
	}

	virtual int Run() {
		return CWinThread::Run();
	}
};

class CDocument : public CCmdTarget {
	DECLARE_DYNAMIC(CDocument)
public:
	CDocument::CDocument() {

	}
	~CDocument() {}
};

class CWnd : public CCmdTarget {
	DECLARE_DYNAMIC(CWnd)
public:
	CWnd() {}
	~CWnd() {}
	virtual BOOL Create();
	BOOL CreateEx();
	virtual BOOL PreCreateWindow();
};

class CFrameWnd : public CWnd {
	DECLARE_DYNAMIC(CFrameWnd)
public:
	CFrameWnd() {}
	~CFrameWnd() {}
	BOOL Create();
	virtual BOOL PreCreateWindow();
};

class CView : public  CWnd {
	DECLARE_DYNAMIC(CView)
public:
	CView() {}
	~CView() {}
};

CWinApp* AfxGetApp();
#endif

MFC.cpp
#include "my.h"
extern CMyWinApp theApp;


static char szCObject[] = "CObject";
struct CRuntimeClass CObject::classCObject = {
	szCObject, sizeof(CObject), 0xffff, NULL, NULL, NULL};
	static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
	CRuntimeClass* CRuntimeClass::pFirstClass = NULL;




AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass) {
	pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
	CRuntimeClass::pFirstClass = pNewClass;
}


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


BOOL CWnd::Create() {
	return TRUE;
}


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


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


BOOL CFrameWnd::Create() {
	CreateEx();
	return TRUE;
}


BOOL CFrameWnd::PreCreateWindow() {
	return TRUE;
}


IMPLEMENT_DYNAMIC(CCmdTarget, CObject)
IMPLEMENT_DYNAMIC(CWinThread, CCmdTarget)
IMPLEMENT_DYNAMIC(CWinApp, CWinThread)
IMPLEMENT_DYNAMIC(CWnd, CCmdTarget)
IMPLEMENT_DYNAMIC(CFrameWnd, CWnd)
IMPLEMENT_DYNAMIC(CDocument, CCmdTarget)
IMPLEMENT_DYNAMIC(CView, CWnd)


CWinApp* AfxGetApp() {
	return theApp.m_pCurrentWinApp;
}
MY.h
#ifndef __MY_H_
#define	__MY_H_ 
#include <IOSTREAM>
#include "MFC.H"
using namespace std;
class CMyFrameWnd:public CFrameWnd
{
public:
	CMyFrameWnd();
	~CMyFrameWnd(){}
};


class CMyWinApp:public CWinApp
{
public:
	CMyWinApp(){}
	~CMyWinApp(){}
	virtual BOOL InitInstance();
};


class CMyDocument:public CDocument
{
public:
	CMyDocument(){}
	~CMyDocument(){}
};


class CMyView:public CView
{
public:
	CMyView(){}
	~CMyView(){}
};
void PrintAllClasses();
#endif



MY.cpp
#include "MY.h"


CMyWinApp theApp;


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


CMyFrameWnd::CMyFrameWnd() {
	Create();
}


void PrintAllClasses() {
	CRuntimeClass* pClass;


	for(pClass = CRuntimeClass::pFirstClass; pClass != NULL;
		pClass = pClass->m_pNextClass) {
			std::cout << pClass->m_lpszClassName << std::endl;
			std::cout << pClass->m_nObjectSize << std::endl;
			std::cout << pClass->m_wSchema << std::endl;
	}
}


int main() {
	CWinApp* pApp = AfxGetApp();
	pApp->InitApplication();
	pApp->InitInstance();
	pApp->Run();
	PrintAllClasses();
	return 0;
}

抱歉!评论已关闭.