MFC命令绕行读书笔记

BASETYPE_H

#pragma once
#define TRUE 1
#define FALSE 0
typedef char* LPSTR;
typedef const char* LPCSTR;
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef int INT;
typedef unsigned int UINT;
typedef long LONG;
typedef int HWND;
typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG LRESULT;
#define PASCAL __stdcall

AFXMSG_H

#pragma once
enum AfxSig
{
	AfxSig_end = 0,
	AfxSig_vv//AfxSig_xx用来描述消息处理例程memberFxn的类型(参数与返回值)
};
#define ON_COMMAD(id,memberFxn) \
	{WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_vv,(AFX_PMSG)memberFxn},

MFC_H

#pragma once


#include <iostream>
#include "BaseType.h"
#include "AfxMsg.h"
#define WM_COMMAND 0x0111
#define WM_CREATE 0x0001
#define WM_PAINT 0x000F
#define WM_NOTIFY 0x004E
#define CObjectid 0xffff
#define CCmdTargetid 1
#define CWinThreadid 11
#define CWinAppid 111
#define CMyWinAppid 1111
#define CWndid 12
#define CFrameWndid 121
#define CMyFrameWndid 1211
#define CViewid 122
#define CMyViewid 1221
#define CDocumentid 13
#define CMyDocid 131

class CObject;
struct CRuntimeClass
{
	LPCSTR m_lpszClassName;
	int m_ObjectSize;
	UINT m_wSchema;
	CObject* (PASCAL* m_pfnCreateObject)();
	CRuntimeClass* m_pBaseClass;

	CObject* CreateObject();
	static CRuntimeClass* PASCAL Load();


	static CRuntimeClass* pFirstClass;
	CRuntimeClass* m_pNextClass;
};
struct AFX_CLASSINIT
{
	AFX_CLASSINIT(CRuntimeClass* pNewClass)
	{
		pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
		CRuntimeClass::pFirstClass = pNewClass;
	}
};
#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))


/*
eg:
	DECLARE_DYNAMIC(CView)

	public:
		static CRuntimeClass classCView;
		virtual CRuntimeClass* GetRuntimeClass() const;

*/

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

#define DECLARE_DYNCREATE(class_name) \
	DECLARE_DYNAMIC(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)


struct AFX_MSGMAP_ENTRY;

struct AFX_MSGMAP
{
	AFX_MSGMAP* pBaseMessageMap;
	AFX_MSGMAP_ENTRY* lpEntries;
};

#define DECLARE_MESSAGE_MAP() \
	static AFX_MSGMAP_ENTRY _messageEntries[]; \
	static AFX_MSGMAP messageMap; \
	virtual AFX_MSGMAP* GetMessageMap() const;



#define BEGIN_MESSAGE_MAP(theClass,baseClass) \
	AFX_MSGMAP* theClass::GetMessageMap() const \
	{return &theClass::messageMap;} \
	AFX_MSGMAP theClass::messageMap = \
	{&(baseClass::messageMap), \
		(AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries)}; \
	AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
	{

#define END_MESSAGE_MAP() \
	{0,0,0,0,AfxSig_end,(AFX_PMSG)0} \
	};


//#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
//AFX_MSGMAP* theClass::GetMessageMap() const \
// { return &theClass::messageMap; } \
// AFX_MSGMAP theClass::messageMap = \
// { &(baseClass::messageMap), \
// (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; \
// AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
// {
//
//#define END_MESSAGE_MAP() \
// { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
// };

class CObject
{
public:
	CObject()
	{
		std::cout << "CObject Constructor" << std::endl;
	}
	~CObject()
	{
		std::cout << "CObject Destructor" << std::endl;
	}
public:
	virtual CRuntimeClass* GetRuntimeClass() const;
	static CRuntimeClass classCObject;
	BOOL IsKindOf(const CRuntimeClass* pClass) const;
};

class CCmdTarget :public CObject
{
	DECLARE_DYNAMIC(CCmdTarget)
public:
	
	CCmdTarget()
	{
		std::cout << "CCmdTarget Constructor" << std::endl;
	}
	~CCmdTarget()
	{
		std::cout << "CCmdTarget Destructor" << std::endl;
	}
	virtual BOOL OnCmdMsg(UINT nID, int nCode);
	DECLARE_MESSAGE_MAP()
};
class CWinThread :public CCmdTarget
{
	DECLARE_DYNAMIC(CWinThread)
public:
	CWinThread()
	{
		std::cout << "CWinThread Constructor" << std::endl;
	}
	~CWinThread()
	{
		std::cout << "CWinThread Destructor" << std::endl;
	}
	virtual BOOL InitInstance()
	{
		std::cout << "CWinThread::InitApplication()" << std::endl;
		return TRUE;
	}
	virtual int Run()
	{
		std::cout << "CWinThread::Run()" << std::endl;
		return 1;
	}
};
typedef void (CCmdTarget::*AFX_PMSG)(void);
struct AFX_MSGMAP_ENTRY
{
	UINT nMessage;// windows message
	UINT nCode;// control code or WM_NOTIFY code
	UINT nID;// control ID (or 0 for windows messages)
	UINT nLastID;// used for entries specifying a range of control id's
	UINT nSig;// signature type (action) or pointer to message #
	AFX_PMSG pfn;// routine to call (or special value)
};


class CWnd;
class CWinApp :public CWinThread
{
	DECLARE_DYNAMIC(CWinApp)
public:
	CWinApp* m_pCurrentWinApp;
	CWnd* m_pMainWnd;
public:
	CWinApp() :m_pCurrentWinApp(this)
	{
		std::cout << "CWinApp Constructor" << std::endl;

	}
	~CWinApp()
	{
		std::cout << "CWinApp Destructor" << std::endl;

	}
	virtual BOOL InitApplication() 
	{
		std::cout << "CWinApp::InitApplication()" << std::endl;
		return TRUE;
	}
	virtual BOOL InitInstance()
	{
		std::cout << "CWinApp::InitInstance()" << std::endl;
		return TRUE;
	}
	virtual int Run() 
	{
		std::cout << "CWinApp::Run()" << std::endl;
		return CWinThread::Run();
	}
	DECLARE_MESSAGE_MAP()
};

class CDocument :public CCmdTarget
{
	DECLARE_DYNAMIC(CDocument)
public:
	CDocument()
	{
		std::cout << "CDocument Constructor" << std::endl;

	}
	~CDocument()
	{
		std::cout << "CDocument Destructor" << std::endl;

	}
	virtual BOOL OnCmdMsg(UINT nID, int nCode);
	DECLARE_MESSAGE_MAP()
};

class CWnd :public CCmdTarget
{
	DECLARE_DYNCREATE(CWnd)
public:
	CWnd()
	{
		std::cout << "CWnd Constructor" << std::endl;

	}
	~CWnd()
	{
		std::cout << "CWnd Destructor" << std::endl;

	}
	virtual BOOL Create();
	BOOL CreateEx();
	virtual BOOL PreCreateWindow();
	/*判断消息是否为WM_COMMAND。如果不是就把消息往父类推去,父类
	别再往祖父类别推去。每到一个类别的消息映射表,比对AFX_MSGMAP_ENTRY的每一个元素
	比对成功就调用对应的处理例程*/
	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
	virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
	DECLARE_MESSAGE_MAP()
};

class CView;
class CFrameWnd :public CWnd
{
	DECLARE_DYNCREATE(CFrameWnd)
public:
	CView* m_pViewActive;
public:
	CFrameWnd()
	{
		std::cout << "CFrameWnd Constructor" << std::endl;

	}
	~CFrameWnd()
	{
		std::cout << "CFrameWnd Destructor" << std::endl;

	}
	BOOL Create();
	CView* GetActiveView() const;
	virtual  BOOL PreCreateWindow();
	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
	virtual BOOL OnCmdMsg(UINT nID, int nCode);
	DECLARE_MESSAGE_MAP()
};

class CView :public CWnd
{
	DECLARE_DYNAMIC(CView)
public:
	CDocument* m_pDocument;
public:
	CView()
	{
		std::cout << "CView Constructor" << std::endl;

	}
	~CView()
	{
		std::cout << "CView Destructor" << std::endl;

	}
	virtual BOOL OnCmdMsg(UINT nID, int nCode);
	DECLARE_MESSAGE_MAP()
};

CWinApp* AfxGetApp();
LRESULT AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMSg, WPARAM wParam, LPARAM lParam);

LRESULT AfxWndProc(HWND hWnd, UINT nMSg, WPARAM wParam, LPARAM lParam, CWnd *pWnd);

MFC_CPP

#include "stdafx.h"
#include "MY.h"
extern CMyWinApp theApp;


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

BEGIN_MESSAGE_MAP(CWnd, CCmdTarget)
	ON_COMMAD(CWndid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CFrameWnd, CWnd)
	ON_COMMAD(CFrameWndid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CDocument, CCmdTarget)
	ON_COMMAD(CDocumentid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CView, CWnd)
	ON_COMMAD(CViewid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CWinApp, CCmdTarget)
	ON_COMMAD(CWinAppid, 0)
END_MESSAGE_MAP()

CRuntimeClass* CRuntimeClass::pFirstClass = nullptr;

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

CRuntimeClass * CRuntimeClass::Load()
{
	char szClassName[64] = { 0 };
	CRuntimeClass* pClass = nullptr;
	std::cout << "enter a class name..." << std::endl;
	std::cin >> szClassName;
	for (pClass = pFirstClass; pClass != nullptr; pClass = pClass->m_pNextClass)
	{
		if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
		{
			return pClass;
		}
	}
	return nullptr;
}
/********************CObject********************/
CRuntimeClass* CObject::GetRuntimeClass() const
{
	return &CObject::classCObject;
}

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




CObject * CRuntimeClass::CreateObject()
{
	if (nullptr == m_pfnCreateObject)
	{
		return nullptr;
	}
	return (m_pfnCreateObject());
}
/********************CObject********************/

/********************CCmdTarget********************/
AFX_MSGMAP* CCmdTarget::GetMessageMap() const
{
	return &CCmdTarget::messageMap;
}
AFX_MSGMAP CCmdTarget::messageMap =
{
	nullptr,
	&CCmdTarget::_messageEntries[0]
};
AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[] =
{
	{0,0,CCmdTargetid,0,AfxSig_end,0}
};
BOOL CCmdTarget::OnCmdMsg(UINT nID, int nCode)
{
	std::cout << "CCmdTarget::OnCmdMsg()" << std::endl;
	AFX_MSGMAP* pMessageMap = nullptr;
	AFX_MSGMAP_ENTRY* lpEntry = nullptr;
	for (pMessageMap = GetMessageMap(); pMessageMap != nullptr; pMessageMap = pMessageMap->pBaseMessageMap)
	{
		lpEntry = pMessageMap->lpEntries;
		printlpEntries(lpEntry);
	}
	return FALSE;
}
/********************CCmdTarget********************/

/********************CWnd********************/
BOOL CWnd::Create()
{
	std::cout << "CWnd::Create()" << std::endl;
	return TRUE;
}
BOOL CWnd::CreateEx()
{
	std::cout << "CWnd::CreateEx()" << std::endl;
	PreCreateWindow();
	return TRUE;
}
BOOL CWnd::PreCreateWindow()
{
	std::cout << "CWnd::PreCreateWindow()" << std::endl;
	return TRUE;
}
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	AFX_MSGMAP* pMessageMap = nullptr;
	AFX_MSGMAP_ENTRY* lpEntry = nullptr;
	if (WM_COMMAND == message)
	{
		if (OnCommand(wParam, lParam))
			return 1L;
		else
		{
			return (LRESULT)DefWindowProc(message, wParam, lParam);
		}
	}
	pMessageMap = GetMessageMap();
	for (; pMessageMap != nullptr; pMessageMap = pMessageMap->pBaseMessageMap)
	{
		lpEntry = pMessageMap->lpEntries;
		printlpEntries(lpEntry);
	}
	return 0;
}
LRESULT CWnd::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	return TRUE;
}
BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
	return OnCmdMsg(0, 0);
}
/********************CWnd********************/

/********************CFrameWnd********************/
BOOL CFrameWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
	std::cout << "OnCommand" << std::endl;
	return CWnd::OnCommand(wParam, lParam);
}
BOOL CFrameWnd::Create()
{
	std::cout << "CFrameWnd::Create()" << std::endl;
	CreateEx();
	return TRUE;
}
BOOL CFrameWnd::PreCreateWindow()
{
	std::cout << "CFrameWnd::PreCreateWindow()" << std::endl;
	return TRUE;
}
CView* CFrameWnd::GetActiveView() const
{
	return m_pViewActive;
}
BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode)
{
	std::cout << "CFrameWnd::OnCmdMsg()" << std::endl;
	CView* pView = GetActiveView();
	if (pView->OnCmdMsg(nID, nCode))
		return TRUE;
	if (CWnd::OnCmdMsg(nID, nCode))
		return TRUE;
	CWinApp* pApp = AfxGetApp();
	if (pApp->OnCmdMsg(nID, nCode))
		return TRUE;
	return FALSE;
}
/********************CFrameWnd********************/

/********************CView********************/
BOOL CView::OnCmdMsg(UINT nID, int nCode)
{
	std::cout << "CView::OnCmdMsg()" << std::endl;
	if (CWnd::OnCmdMsg(nID, nCode))
		return TRUE;
	BOOL bHandled = FALSE;
	bHandled = m_pDocument->OnCmdMsg(nID, nCode);
	return bHandled;
}
/********************CDocument********************/
BOOL CDocument::OnCmdMsg(UINT nID, int nCode)
{
	std::cout << "CDocument::OnCmdMsg()" << std::endl;
	if (CCmdTarget::OnCmdMsg(nID, nCode))
		return TRUE;
	return FALSE;
}
/********************CDocument********************/

CWinApp * AfxGetApp()
{
	return theApp.m_pCurrentWinApp;
}
LRESULT AfxWndProc(HWND hWnd, UINT nMSg, WPARAM wParam, LPARAM lParam, CWnd *pWnd)
{
	std::cout << "AfxWndProc" << std::endl;
	return AfxCallWndProc(pWnd, hWnd, nMSg, wParam, lParam);
}
LRESULT AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMSg, WPARAM wParam, LPARAM lParam)
{
	std::cout << "AfxCallWndProc" << std::endl;
	LRESULT lResult = pWnd->WindowProc(nMSg, wParam, lParam);
	return lResult;
	
}

MY_H

#pragma once
#include "MFC.h"
class CMyFrameWnd :public CFrameWnd
{
	DECLARE_DYNCREATE(CMyFrameWnd)
public:
	CMyFrameWnd()
	{
		std::cout << "CMyFrameWnd Constructor" << std::endl;
		Create();
	}
	~CMyFrameWnd()
	{
		std::cout << "CMyFrameWnd Destructor" << std::endl;

	}
	DECLARE_MESSAGE_MAP()
};
class CMyWinApp :public CWinApp
{
	DECLARE_DYNCREATE(CMyWinApp)
public:
	CMyWinApp()
	{
		std::cout << "CMyWinApp Constructor" << std::endl;

	}
	~CMyWinApp()
	{
		std::cout << "CMyWinApp Destructor" << std::endl;

	}
	virtual BOOL InitInstance() 
	{
		std::cout << "CMyWinApp::Create()" << std::endl;
		m_pMainWnd = new CMyFrameWnd;
		return TRUE;
	}
	DECLARE_MESSAGE_MAP()
};
class CMyDoc :public CDocument
{
public:
	CMyDoc() {}
	~CMyDoc() {}
	DECLARE_MESSAGE_MAP()
};
class CMyView:public CView
{
public:
	CMyView() {}
	~CMyView() {}
	DECLARE_MESSAGE_MAP()
};
void printlpEntries(AFX_MSGMAP_ENTRY* lpEntry);
void MsgMapPrinting(AFX_MSGMAP* pMessageMap);

MY_CPP

#include "stdafx.h"
#include "MY.h"
CMyWinApp theApp;


IMPLEMENT_DYNCREATE(CMyFrameWnd,CFrameWnd)
IMPLEMENT_DYNCREATE(CMyWinApp, CWinApp)

BEGIN_MESSAGE_MAP(CMyWinApp,CWinApp)
	ON_COMMAD(CMyWinAppid,0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
	ON_COMMAD(CMyFrameWndid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMyView, CView)
	ON_COMMAD(CMyViewid, 0)
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
	ON_COMMAD(CMyDocid, 0)
END_MESSAGE_MAP()
//BOOL CMyWinApp::InitInstance()
//{
//	return 0;
//}

void printlpEntries(AFX_MSGMAP_ENTRY* lpEntry)
{
	struct  
	{
		int classid;
		char* classname;
	}classinfo[]=
	{
		CCmdTargetid,"CCmdTarget",
		CWinThreadid,"CWinThread",
		CWinAppid,"CWinApp",
		CMyWinAppid,"CMyWinApp",
		CWndid,"CWnd",
		CFrameWndid,"CFrameWnd",
		CMyFrameWndid,"CMyFrameWnd",
		CViewid,"CView",
		CDocumentid,"CDocument",
		0," "
	};
	for (unsigned i = 0; classinfo[i].classid != 0; ++i)
	{
		if (classinfo[i].classid == lpEntry->nID)
		{
			std::cout << lpEntry->nID << " ";
			std::cout << classinfo[i].classname << std::endl;
			break;
		}
	}
}
void MsgMapPrinting(AFX_MSGMAP* pMessageMap)
{
	for (; pMessageMap != nullptr; pMessageMap = pMessageMap->pBaseMessageMap)
	{
		AFX_MSGMAP_ENTRY* lpEntry = pMessageMap->lpEntries;
		printlpEntries(lpEntry);
	}
}

MFC_Simulat.cpp

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

#include "stdafx.h"

#include "MY.h"
using namespace std;
/*main 函数调用全域函数AfxGetApp 以取得theApp 的对象指针*/
int main()
{
	CWinApp* pApp = AfxGetApp();
	CRuntimeClass* prun = &CObject::classCObject;
	pApp->InitApplication();
	pApp->InitInstance();
	pApp->Run();
	CMyDoc* pMyDoc = new CMyDoc;
	CMyView* pMyView = new CMyView;
	CFrameWnd* pMyFrame = (CFrameWnd*)pApp->m_pMainWnd;
	
	cout << endl << "pMyFrame received a WM_CREATE, routing path :" << endl;
	AfxWndProc(0, WM_CREATE, 0, 0, pMyFrame);
	/*cout << endl << "pMyView received a WM_PAINT, routing path :" << endl;
	AfxWndProc(0, WM_PAINT, 0, 0, pMyView);
	cout << endl << "pMyView received a WM_COMMAND, routing path :" << endl;
	AfxWndProc(0, WM_COMMAND, 0, 0, pMyView);
	cout << endl << "pMyFrame received a WM_COMMAND, routing path :" << endl;
	AfxWndProc(0, WM_COMMAND, 0, 0, pMyFrame);*/
	getchar();
    return 0;
}

解读图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值