深入浅出MFC Message Mapping 消息映射

stdafx

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

mfc.h

#include "afxmsg_.h"
#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;

#define  WM_COMMAND    0x0111
#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


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,baseClass1)\
	 AFX_MSGMAP* theClass::GetMessageMap() const\
       { return &theClass::messageMap;}\
	 AFX_MSGMAP theClass::messageMap={ &(baseClass1::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();
};

class CCmdTarget:public CObject
{
   public:
	   DECLARE_MESSAGE_MAP(CCmdTarget)
};

typedef void (CCmdTarget::*AFX_PMSG)(void);
struct AFX_MSGMAP_ENTRY
{
	UINT nMessage;
	UINT nCode;
	UINT nID;
	UINT nLastID;
	UINT nSig;
	AFX_PMSG pfn;
};




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

class CWnd;
class CWinApp:public CWinThread
{
   public:
	   CWinApp();
	   CWinApp * m_pCurrentWinApp;
	   CWnd    * m_pMainWnd;
	   virtual BOOL InitApplication();
	   virtual BOOL InitInstance();
	   virtual int Run();
	   DECLARE_MESSAGE_MAP()
  
};
typedef  void (CWnd::*AFX_PMSGW)(void);
//like AFX_PMSG  but for CWnd derived classes  only  ????????????

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

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

class CView:public CWnd
{
   public:
	   DECLARE_MESSAGE_MAP()
};

class CDocument:public CCmdTarget
{
   public:
	   DECLARE_MESSAGE_MAP()
};
 
mfc.cpp

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


CObject::CObject()
{

}


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 TRUE;
}
int CWinApp::Run()
{
	cout<<"CWinApp::Run"<<endl;
	return 1;
}


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

}
 

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


 

AFX_MSGMAP *CCmdTarget::GetMessageMap() const
{
	return &CCmdTarget::messageMap;
}
AFX_MSGMAP CCmdTarget::messageMap=
{
	NULL,
	&CCmdTarget::_messageEntries[0]

};
AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[]=
{
	{0,0,CCmdTargetid,0,AfxSig_end,0}
};


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


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


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

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


BEGIN_MESSAGE_MAP(CWinApp,CCmdTarget)
ON_COMMAND(CWinAppid,0)
END_MESSAGE_MAP()
MY.h


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


class CMyWinApp:public CWinApp
{
public:
	virtual BOOL InitInstance();
	DECLARE_MESSAGE_MAP()
};
class CMyFrameWnd:public CFrameWnd
{
public:
	CMyFrameWnd();
	DECLARE_MESSAGE_MAP()
};
class CMyDoc:public CDocument
{
  public:
	DECLARE_MESSAGE_MAP()
};
class CMyView:public CView
{
  public:
	DECLARE_MESSAGE_MAP()
};

void printlpEntries(AFX_MSGMAP_ENTRY * lpEntry);
 void MsgMapPrinting(AFX_MSGMAP *pMessageMap);



MY.CPP

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


 
BOOL  CMyWinApp::InitInstance()
{
	cout<<"CMyWinApp::InitInstance"<<endl;
	m_pMainWnd=new CMyFrameWnd;
	return TRUE;
}

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

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


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



BEGIN_MESSAGE_MAP(CMyDoc,CDocument)
ON_COMMAND(CMyDocid,0)
END_MESSAGE_MAP()


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


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"},
		{CMyViewid,"CMyView"},
		{CDocumentid,"CDocument"},
		{CMyDocid,"CMyDoc"},
		{0,"     "}
	};

	for (int i=0;classinfo[i].classid!=0;i++)
	{
		if (classinfo[i].classid==lpEntry->nID)
		{
			cout<<lpEntry->nID<<"  ";
			cout<<classinfo[i].classname<<endl;
			break;
		}
	}

}
 void MsgMapPrinting(AFX_MSGMAP *pMessageMap)
 {
	 for (;pMessageMap!=NULL;pMessageMap=pMessageMap->pBaseMessageMap)
	 {
		 AFX_MSGMAP_ENTRY *lpEntry=pMessageMap->lpEntries;
		 printlpEntries(lpEntry);
	 }
 }



afxmsg_.h

enum AfxSig
{
	AfxSig_end=0,
	AfxSig_vv,
};
#define ON_COMMAND(id,memberFxn)\
{WM_COMMAND,0,(WORD)id,(WORD)id,AfxSig_vv,(AFX_PMSG)memberFxn },





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值