深入浅出MFC Message Mapping 消息映射

来源:互联网 发布:上海晓通网络 编辑:程序博客网 时间:2024/05/21 18:35

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 0typedef  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  131struct 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