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;
}
解读图

1872

被折叠的 条评论
为什么被折叠?



