深入浅出MFC---Frame8

AfxWndProc

AfxCallWndProc


CCmdTarget OnCmdMsg virtual

CWnd WindowProc      virtual
     OnCommand       virtual
     DefWindowProc   virtual

CFrameWnd  OnCommand       virtual
           OnCmdMsg        virtual

CView   OnCmdMsg        virtual

CDocument   OnCmdMsg        virtual


AfxWndProc 好比一个消息推动引擎,AfxWndProc又调用AfxCallWndProc

LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	// special message which identifies the window as using AfxWndProc
	if (nMsg == WM_QUERYAFXWNDPROC)
		return 1;

	// all other messages route through message map
	CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
	ASSERT(pWnd != NULL);
	ASSERT(pWnd->m_hWnd == hWnd);
	if (pWnd == NULL || pWnd->m_hWnd != hWnd)
		return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
	return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}


LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
	WPARAM wParam = 0, LPARAM lParam = 0)
{
	_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
	MSG oldState = pThreadState->m_lastSentMsg;   // save for nesting
	pThreadState->m_lastSentMsg.hwnd = hWnd;
	pThreadState->m_lastSentMsg.message = nMsg;
	pThreadState->m_lastSentMsg.wParam = wParam;
	pThreadState->m_lastSentMsg.lParam = lParam;

#ifdef _DEBUG
	if (afxTraceFlags & traceWinMsg)
		_AfxTraceMsg(_T("WndProc"), &pThreadState->m_lastSentMsg);
#endif

	// Catch exceptions thrown outside the scope of a callback
	// in debug builds and warn the user.
	LRESULT lResult;
	TRY
	{
#ifndef _AFX_NO_OCC_SUPPORT
		// special case for WM_DESTROY
		if ((nMsg == WM_DESTROY) && (pWnd->m_pCtrlCont != NULL))
			pWnd->m_pCtrlCont->OnUIActivate(NULL);
#endif

		// special case for WM_INITDIALOG
		CRect rectOld;
		DWORD dwStyle = 0;
		if (nMsg == WM_INITDIALOG)
			_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);

		// delegate to object's WindowProc
		lResult = pWnd->WindowProc(nMsg, wParam, lParam);

		// more special case for WM_INITDIALOG
		if (nMsg == WM_INITDIALOG)
			_AfxPostInitDialog(pWnd, rectOld, dwStyle);
	}
	CATCH_ALL(e)
	{
		CWinThread* pWinThread = AfxGetThread();
		if ( pWinThread != NULL )
		{
			lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
			TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
				lResult);
		}
		else
		{
			TRACE0("Warning: Uncaught exception in WindowProc.\n");
			lResult = 0;
		}
		DELETE_EXCEPTION(e);
	}
	END_CATCH_ALL

	pThreadState->m_lastSentMsg = oldState;
	return lResult;
}


LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// OnWndMsg does most of the work, except for DefWindowProc call
	LRESULT lResult = 0;
	if (!OnWndMsg(message, wParam, lParam, &lResult))
		lResult = DefWindowProc(message, wParam, lParam);
	return lResult;
}

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	LRESULT lResult = 0;

	// special case for commands
	if (message == WM_COMMAND)
	{
		if (OnCommand(wParam, lParam))
		{
			lResult = 1;
			goto LReturnTrue;
		}
		return FALSE;
	}

	// special case for notifies
	if (message == WM_NOTIFY)
	{
		NMHDR* pNMHDR = (NMHDR*)lParam;
		if (pNMHDR->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
			goto LReturnTrue;
		return FALSE;
	}

	// special case for activation
	if (message == WM_ACTIVATE)
		_AfxHandleActivate(this, wParam, CWnd::FromHandle((HWND)lParam));

	// special case for set cursor HTERROR
	if (message == WM_SETCURSOR &&
		_AfxHandleSetCursor(this, (short)LOWORD(lParam), HIWORD(lParam)))
	{
		lResult = 1;
		goto LReturnTrue;
	}
.............
...........
}

如果是一般的WM_XX标准消息,消息沿着基类走(CWinThread没有消息映射)
如果是WM_COMMAND 消息,流程为这样.
先在    CView里面找与之匹配的消息,,
再在    CDocument里面寻找..
再在    CFrameWnd里面找
最后再在CWinApp里面找


BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam)
	// return TRUE if command invocation was attempted
{
	UINT nID = LOWORD(wParam);
	HWND hWndCtrl = (HWND)lParam;
	int nCode = HIWORD(wParam);

	// default routing for command messages (through closure table)

	if (hWndCtrl == NULL)
	{
		// zero IDs for normal commands are not allowed
		if (nID == 0)
			return FALSE;

		// make sure command has not become disabled before routing
		CTestCmdUI state;
		state.m_nID = nID;
		OnCmdMsg(nID, CN_UPDATE_COMMAND_UI, &state, NULL);
		if (!state.m_bEnabled)
		{
			TRACE1("Warning: not executing disabled command %d\n", nID);
			return TRUE;
		}

		// menu or accelerator
		nCode = CN_COMMAND;
	}
	else
	{
		// control notification
		ASSERT(nID == 0 || ::IsWindow(hWndCtrl));

		if (_afxThreadState->m_hLockoutNotifyWindow == m_hWnd)
			return TRUE;        // locked out - ignore control notification

		// reflect notification to child window control
		if (ReflectLastMsg(hWndCtrl))
			return TRUE;    // eaten by child

		// zero IDs for normal commands are not allowed
		if (nID == 0)
			return FALSE;
	}

#ifdef _DEBUG
	if (nCode < 0 && nCode != (int)0x8000)
		TRACE1("Implementation Warning: control notification = $%X.\n",
			nCode);
#endif

	return OnCmdMsg(nID, nCode, NULL, NULL);
}

BOOL CFrameWnd::OnCommand(WPARAM wParam, LPARAM lParam)
	// return TRUE if command invocation was attempted
{
	HWND hWndCtrl = (HWND)lParam;
	UINT nID = LOWORD(wParam);

	CFrameWnd* pFrameWnd = GetTopLevelFrame();
	ASSERT_VALID(pFrameWnd);
	if (pFrameWnd->m_bHelpMode && hWndCtrl == NULL &&
		nID != ID_HELP && nID != ID_DEFAULT_HELP && nID != ID_CONTEXT_HELP)
	{
		// route as help
		if (!SendMessage(WM_COMMANDHELP, 0, HID_BASE_COMMAND+nID))
			SendMessage(WM_COMMAND, ID_DEFAULT_HELP);
		return TRUE;
	}

	// route as normal command
	return CWnd::OnCommand(wParam, lParam);
}

BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
	AFX_CMDHANDLERINFO* pHandlerInfo)
{
	CPushRoutingFrame push(this);

	// pump through current view FIRST
	CView* pView = GetActiveView();
	if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// then pump through frame
	if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// last but not least, pump through app
	CWinApp* pApp = AfxGetApp();
	if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	return FALSE;
}

BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
	AFX_CMDHANDLERINFO* pHandlerInfo)
{
	// first pump through pane
	if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// then pump through document
	if (m_pDocument != NULL)
	{
		// special state for saving view before routing to document
		CPushRoutingView push(this);
		return m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
	}

	return FALSE;
}

BOOL CDocument::OnCmdMsg(UINT nID, int nCode, void* pExtra,
	AFX_CMDHANDLERINFO* pHandlerInfo)
{
	if (CCmdTarget::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// otherwise check template
	if (m_pDocTemplate != NULL &&
	  m_pDocTemplate->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	return FALSE;
}

示例代码:

#include <windows.h>
#include <stdio.h>
//
enum AfxSig
{
	AfxSig_end = 0,     // [marks end of message map]
		
		AfxSig_bD,      // BOOL (CDC*)
		AfxSig_bb,      // BOOL (BOOL)
		AfxSig_bWww,    // BOOL (CWnd*, UINT, UINT)
		AfxSig_hDWw,    // HBRUSH (CDC*, CWnd*, UINT)
		AfxSig_hDw,     // HBRUSH (CDC*, UINT)
		AfxSig_iwWw,    // int (UINT, CWnd*, UINT)
		AfxSig_iww,     // int (UINT, UINT)
		AfxSig_iWww,    // int (CWnd*, UINT, UINT)
		AfxSig_is,      // int (LPTSTR)
		AfxSig_lwl,     // LRESULT (WPARAM, LPARAM)
		AfxSig_lwwM,    // LRESULT (UINT, UINT, CMenu*)
		AfxSig_vv,      // void (void)
		
		AfxSig_vw,      // void (UINT)
		AfxSig_vww,     // void (UINT, UINT)
		AfxSig_vvii,    // void (int, int) // wParam is ignored
		AfxSig_vwww,    // void (UINT, UINT, UINT)
		AfxSig_vwii,    // void (UINT, int, int)
		AfxSig_vwl,     // void (UINT, LPARAM)
		AfxSig_vbWW,    // void (BOOL, CWnd*, CWnd*)
		AfxSig_vD,      // void (CDC*)
		AfxSig_vM,      // void (CMenu*)
		AfxSig_vMwb,    // void (CMenu*, UINT, BOOL)
		
		AfxSig_vW,      // void (CWnd*)
		AfxSig_vWww,    // void (CWnd*, UINT, UINT)
		AfxSig_vWp,     // void (CWnd*, CPoint)
		AfxSig_vWh,     // void (CWnd*, HANDLE)
		AfxSig_vwW,     // void (UINT, CWnd*)
		AfxSig_vwWb,    // void (UINT, CWnd*, BOOL)
		AfxSig_vwwW,    // void (UINT, UINT, CWnd*)
		AfxSig_vwwx,    // void (UINT, UINT)
		AfxSig_vs,      // void (LPTSTR)
		AfxSig_vOWNER,  // void (int, LPTSTR), force return TRUE
		AfxSig_iis,     // int (int, LPTSTR)
		AfxSig_wp,      // UINT (CPoint)
		AfxSig_wv,      // UINT (void)
		AfxSig_vPOS,    // void (WINDOWPOS*)
		AfxSig_vCALC,   // void (BOOL, NCCALCSIZE_PARAMS*)
		AfxSig_vNMHDRpl,    // void (NMHDR*, LRESULT*)
		AfxSig_bNMHDRpl,    // BOOL (NMHDR*, LRESULT*)
		AfxSig_vwNMHDRpl,   // void (UINT, NMHDR*, LRESULT*)
		AfxSig_bwNMHDRpl,   // BOOL (UINT, NMHDR*, LRESULT*)
		AfxSig_bHELPINFO,   // BOOL (HELPINFO*)
		AfxSig_vwSIZING,    // void (UINT, LPRECT) -- return TRUE
		
		// signatures specific to CCmdTarget
		AfxSig_cmdui,   // void (CCmdUI*)
		AfxSig_cmduiw,  // void (CCmdUI*, UINT)
		AfxSig_vpv,     // void (void*)
		AfxSig_bpv,     // BOOL (void*)
		
		// Other aliases (based on implementation)
		AfxSig_vwwh,                // void (UINT, UINT, HANDLE)
		AfxSig_vwp,                 // void (UINT, CPoint)
		AfxSig_bw = AfxSig_bb,      // BOOL (UINT)
		AfxSig_bh = AfxSig_bb,      // BOOL (HANDLE)
		AfxSig_iw = AfxSig_bb,      // int (UINT)
		AfxSig_ww = AfxSig_bb,      // UINT (UINT)
		AfxSig_bv = AfxSig_wv,      // BOOL (void)
		AfxSig_hv = AfxSig_wv,      // HANDLE (void)
		AfxSig_vb = AfxSig_vw,      // void (BOOL)
		AfxSig_vbh = AfxSig_vww,    // void (BOOL, HANDLE)
		AfxSig_vbw = AfxSig_vww,    // void (BOOL, UINT)
		AfxSig_vhh = AfxSig_vww,    // void (HANDLE, HANDLE)
		AfxSig_vh = AfxSig_vw,      // void (HANDLE)
		AfxSig_viSS = AfxSig_vwl,   // void (int, STYLESTRUCT*)
		AfxSig_bwl = AfxSig_lwl,
		AfxSig_vwMOVING = AfxSig_vwSIZING,  // void (UINT, LPRECT) -- return TRUE
		
		AfxSig_vW2,                 // void (CWnd*) (CWnd* comes from lParam)
		AfxSig_bWCDS,               // BOOL (CWnd*, COPYDATASTRUCT*)
		AfxSig_bwsp,                // BOOL (UINT, short, CPoint)
		AfxSig_vws,
};


class CCmdTarget;

typedef void (CCmdTarget::*AFX_PMSG)(void);

struct AFX_MSGMAP_ENTRY
{
	UINT nMessage;
	UINT nCode;
	UINT nID;
	UINT nLastID;
	UINT nSig;
	AFX_PMSG pfn;
};

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

//
#define DECLARE_MESSAGE_MAP() \
private: \
	static AFX_MSGMAP_ENTRY _messageEntries[]; \
public: \
	static AFX_MSGMAP messageMap; \
	virtual AFX_MSGMAP* GetMessageMap(); \
	
//
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
	AFX_MSGMAP* theClass::GetMessageMap() \
{ return &theClass::messageMap; } \
	AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
    AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \
//
#define END_MESSAGE_MAP() \
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
}; \
//
class CWinThread;
	class CWinApp;


void printlpEntry(AFX_MSGMAP_ENTRY *lpEntry);
void MsgMapPrinting(AFX_MSGMAP *pMessageMap);
CWinApp *AfxGetApp();
CWinThread *AfxGetThread();





#define WM_COMMAND 0x0111
#define WM_CREATE  0x0001
#define WM_PAINT   0x000F
#define WM_NOTIFY  0x004F 

#define CN_COMMAND 0

#define ON_COMMAND(id, memberFxn) \
	{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },
#define afx_msg

#define CCmdTargetID  0
#define CWinAppID     1
#define CWndID        2
#define CViewID       3
#define CDocumentID   4
#define CMyFrameWndID 5
#define CMyWinAppID   6
#define CFrameWndID   7

#define AFX_COMDAT
#define AFX_DATADEF
//
//

class CObject
{
public:
	CObject()
	{
	}
	~CObject()
	{
	}
};
//
class CCmdTarget:public CObject
{
public:
	CCmdTarget()
	{
	}
	~CCmdTarget()
	{
	}
	virtual BOOL OnCmdMsg(UINT nID,int nCode)
	{
		printf("CCmdTarget OnCmdMsg()\n");
		AFX_MSGMAP *pMessageMap;
		AFX_MSGMAP_ENTRY *lpEntry;
		pMessageMap = GetMessageMap();
		for(;pMessageMap!=NULL;pMessageMap = pMessageMap->pBaseMessageMap)
		{
			lpEntry = pMessageMap->lpEntries;
			printlpEntry(lpEntry);
		}
		return FALSE;
	}
	DECLARE_MESSAGE_MAP()
};

AFX_MSGMAP CCmdTarget::messageMap = 
{
	NULL,
	&CCmdTarget::_messageEntries[0]
};

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

AFX_MSGMAP* CCmdTarget::GetMessageMap()
{ 
	return &CCmdTarget::messageMap;
};


class CWinThread:public CCmdTarget
{
public:
	CWinThread()
	{
	}
	~CWinThread()
	{
	}
public:
	virtual void InitInstance()
	{
		printf("CWinThread InitInstance\n");
	}
	virtual void Run()
	{
		printf("CWinThread Run\n");
	}
};

class CWnd;

class CWinApp:public CWinThread
{
public:
	CWinApp    *m_pCurrentWinApp;
	CWinThread *m_pCurrentWinThread;
	CWnd       *m_pMainWnd;
public:
	CWinApp()
	{
		m_pCurrentWinApp = this;
		m_pCurrentWinThread = this;
	}
	~CWinApp()
	{
	}
public:
	virtual void InitApplication()
	{
		printf("CWinApp InitApplication \n");
	}
	virtual void InitInstance()
	{
		printf("CWinApp InitInstance \n");
	}
	virtual void Run()
	{
		printf("CWinApp Run\n");
		CWinThread::Run();
	}
	DECLARE_MESSAGE_MAP()
	afx_msg void fun()
	{
		printf("");
	};
};
BEGIN_MESSAGE_MAP(CWinApp , CCmdTarget)
	ON_COMMAND(CWinAppID , fun)
END_MESSAGE_MAP()

class CDocument :public CCmdTarget
{
public:
	CDocument()
	{
	}
	~CDocument()
	{
	}
	DECLARE_MESSAGE_MAP()
	afx_msg void fun()
	{

	}
	virtual BOOL OnCmdMsg(UINT nID,int nCode)
	{
		printf("CDocument OnCmdMsg()\n");
		if(CCmdTarget::OnCmdMsg(nID,nCode))
			return TRUE;
		return FALSE;
	}
};
BEGIN_MESSAGE_MAP(CDocument,CCmdTarget)
	ON_COMMAND(CDocumentID , fun)
END_MESSAGE_MAP()

class CWnd:public CCmdTarget
{
public:
	CWnd()
	{
	}
	~CWnd()
	{
	}
public:
	virtual void PreCreateWindow()
	{
		printf("CWnd PreCreateWindow \n");
	}
	virtual void Create()
	{
		printf("CWnd Create \n");
	}
	void CreateEx()
	{
		printf("CWnd CreateEx\n");
		PreCreateWindow();
	}
	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
	{
		printf("CWnd::WindowProc()\n");
		AFX_MSGMAP *pMessageMap;
		AFX_MSGMAP_ENTRY *lpEntry;

		if(message==WM_COMMAND)
		{
			if(OnCommand(wParam,lParam))
				return 1L;
			else
				return (LRESULT)DefWindowProc(message,wParam,lParam);
		}

		pMessageMap = GetMessageMap();
		for(;pMessageMap!=NULL;pMessageMap = pMessageMap->pBaseMessageMap)
		{
			lpEntry = pMessageMap->lpEntries;
			printlpEntry(lpEntry);
		}
		return 0;
	}
	virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam)
	{
		printf("CWnd OnCommand()\n");
		return OnCmdMsg(0,0);
	}
	virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
	{
		return 1;
	}
	virtual BOOL OnCommand(UINT nID,int nCode)
	{
		return TRUE;
	}
	friend class CWinApp;
	DECLARE_MESSAGE_MAP()
	afx_msg void fun()
	{

	}
};
BEGIN_MESSAGE_MAP(CWnd,CCmdTarget)
	ON_COMMAND(CWndID,fun)
END_MESSAGE_MAP()

class CView:public CWnd
{
public:
	CDocument *m_pDocument;
public:
	CView()
	{
	}
	~CView()
	{
	}
	afx_msg void fun()
	{
		
	}
	DECLARE_MESSAGE_MAP()
		
	virtual BOOL CView::OnCmdMsg(UINT nID,int nCode)
	{
		printf("CView::OnCmdMsg()\n");
		if(CWnd::OnCmdMsg(nID,nCode))
			return TRUE;
		BOOL bHandled = FALSE;
		bHandled = m_pDocument->OnCmdMsg(nID,nCode);
	}
	friend class CFrameWnd;
};
BEGIN_MESSAGE_MAP(CView,CWnd)
ON_COMMAND(CViewID,fun)
END_MESSAGE_MAP()


class CFrameWnd:public CWnd
{
	friend class CView;
public:
	CView *m_pViewActive;

public:
	CFrameWnd()
	{
	}
	~CFrameWnd()
	{
	}
public:
	virtual void Create()
	{
		printf("CFrameWnd Create \n");
		CreateEx();
	}
	virtual void PreCreateWindow()
	{
		printf("CFrameWnd PreCreateWindow \n");
	}
	CView *GetActiveView()
	{
		printf("CFrameWnd::GetActiveView()\n");
		return m_pViewActive;
	}

	DECLARE_MESSAGE_MAP(CFrameWnd,CWnd)
	afx_msg void fun()
	{

	}
	virtual BOOL OnCommand(WPARAM wParam,LPARAM lParam)
	{
		printf("CFrameWnd OnCommand()\n");
		return CWnd::OnCommand(wParam,lParam);
	}
	virtual BOOL OnCmdMsg(UINT nID,int nCode)
	{
		printf("CFrameWnd::OnCmdMsg()\n");
		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;
	}
};
BEGIN_MESSAGE_MAP(CFrameWnd,CWnd)
ON_COMMAND(CFrameWndID,fun)
END_MESSAGE_MAP()



//

class CMyFrameWnd:public CFrameWnd
{
public:
	CMyFrameWnd()
	{
		Create();
	}
	~CMyFrameWnd()
	{
	}
	DECLARE_MESSAGE_MAP()
	afx_msg void fun()
	{

	}
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
	ON_COMMAND(CMyFrameWndID,fun)
END_MESSAGE_MAP()

//
class CMyWinApp:public CWinApp
{
public:
	CMyWinApp()
	{
	}
	~CMyWinApp()
	{
	}
public:
	void InitInstance()
	{
		printf("CMyWinApp InitInstance \n");
		m_pMainWnd = new CMyFrameWnd;
	}
	DECLARE_MESSAGE_MAP()
	afx_msg void fun()
	{

	}
};
BEGIN_MESSAGE_MAP(CMyWinApp,CWinApp)
	ON_COMMAND(CMyWinAppID , fun)
END_MESSAGE_MAP()

CMyWinApp theApp;

//
CWinApp *AfxGetApp()
{
	return theApp.m_pCurrentWinApp;
}
CWinThread *AfxGetThread()
{
	return theApp.m_pCurrentWinThread;
}
//

LRESULT AfxCallWndProc(CWnd *pWnd,HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
	printf("AfxCallWndProc()\n");
	LRESULT lResult = pWnd->WindowProc(nMsg,wParam,lParam);
	return lResult;
}
LRESULT AfxWndProc(HWND hWnd , UINT nMsg,WPARAM wParam,LPARAM lParam,CWnd *pWnd)
{
	printf("AfxWndProc()\n");
	return AfxCallWndProc(pWnd,hWnd,nMsg,wParam,lParam);
}

void printlpEntry(AFX_MSGMAP_ENTRY *lpEntry)
{
	struct
	{
		int classid;
		char *classname;
	}classinfo[]=
	{
		CCmdTargetID ,"CCmdTarget",
		CWinAppID    ,"CWinApp",
		CMyWinAppID  ,"CMyWinApp",
		CWndID       ,"CWnd",
		CFrameWndID  ,"CFrameWnd",
		CMyFrameWndID,"CMyFrameWnd",
		CDocumentID  ,"CDocument",
		CViewID      ,"CView"
	};
	for(int i=0; i<sizeof(classinfo)/sizeof(classinfo[0])!=0;i++)
	{
		if(classinfo[i].classid==lpEntry->nID)
		{
			printf("%-8d",lpEntry->nID);
			printf("%s\n",classinfo[i].classname);
		}
	}
}
void MsgMapPrinting(AFX_MSGMAP *pMessageMap)
{
	for(;pMessageMap!=NULL;pMessageMap = pMessageMap->pBaseMessageMap)
	{
		AFX_MSGMAP_ENTRY *lpEntry = pMessageMap->lpEntries;
		printlpEntry(lpEntry);
	}
}

int main()
{
	CWinApp *pApp = AfxGetApp();
	CWinThread *pThread = AfxGetThread();
	pApp->InitApplication();
	pThread->InitInstance();
	pThread->Run();

	CView *pView = new CView;
	CDocument *pDoc = new CDocument;
	CMyFrameWnd *pFrame = new CMyFrameWnd;

	AFX_MSGMAP *pMessageMap = NULL;


	printf("CMyWinApp MessageMap:\n");
	pMessageMap = pApp->GetMessageMap();
	MsgMapPrinting(pMessageMap);
	printf("\n");


	printf("CView MessageMap:\n");
	pMessageMap = pView->GetMessageMap();
	MsgMapPrinting(pMessageMap);
	printf("\n");

	printf("CDocument MessageMap:\n");
	pMessageMap = pDoc->GetMessageMap();
	MsgMapPrinting(pMessageMap);
	printf("\n");

	printf("CMyFrameWnd MessageMap:\n");
	pMessageMap = pFrame->GetMessageMap();
	MsgMapPrinting(pMessageMap);
	printf("\n");

	pFrame = (CMyFrameWnd*)(pApp->m_pMainWnd);
	pFrame->m_pViewActive = pView;

	pView->m_pDocument = pDoc;

	printf("CMyFrameWnd Receive WM_COMAND:\n");
	AfxWndProc(0,WM_COMMAND,0,0,pApp->m_pMainWnd);

	printf("CMyFrameWnd Receive WM_CREATE:\n");
	AfxWndProc(0,WM_CREATE,0,0,pApp->m_pMainWnd);

	printf("CView Receive WM_COMMAND:\n");
	AfxWndProc(0,WM_COMMAND,0,0,pView);
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值