AfxWndProc
CWnd WindowProc virtual
OnCommand virtual
DefWindowProc virtual
CFrameWnd OnCommand virtual
OnCmdMsg virtual
CView OnCmdMsg virtual
CDocument OnCmdMsg virtual
如果是一般的WM_XX标准消息,消息沿着基类走(CWinThread没有消息映射)
如果是WM_COMMAND 消息,流程为这样.
先在 CView里面找与之匹配的消息,,
再在 CDocument里面寻找..
再在 CFrameWnd里面找
最后再在CWinApp里面找
示例代码:
AfxCallWndProc
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;
}