MFC中Command消息包含菜单工具栏等命令消息和控件的Notify消息,其消息流动比较复杂。
大体概括如下,
系统维护 窗口句柄和对象指针的表,VIEW或者Frame类产生消息找到相应的指针调用 OnCommand 其中改写了OnCommand函数的有CWnd CFrameWnd CMDIFrameWnd....
首先感受到CMD消息,也就是父窗口,但是父窗口没有查路由表,相应消息,而是转入虚函数 OnCmdMsg 这个时候要看this指向 Frame View Document等
如果是Frame那么一定主窗口的对象指针,如果主窗口没有重载OnCmdMsg就调用CFrameWnd的虚函数,
这个是CFrame流向
CFrameWnd::OnCmdMsg(nID,nCode,NULL,NULL)
{
顺序
CView* pView = GetActiveView();
return pView->OnCmdMsg(); 流向View Document Document流向 Document DocTemp
return CWnd::OnCmdMsg();
AfxGetApp()->OnCmdMsg();
}
那我们要改变消息流向,或者截获消息,
肯定要重载OnCommand函数
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
int nCmdID = LOWORD(wParam);
int nCode = HIWORD(wParam);
if(nCmdID == IDM_TEST_0)
{
CWnd::OnCmdMsg(nCmdID,nCode,NULL,NULL);
}
return CFrameWnd::OnCommand(wParam, lParam);
}
或者OnCmdMsg
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
if(nID == IDM_TEST_0)
{
return CWnd::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
实质就是改变CFrameWnd中三个函数顺序,或者删除
CView* pView = GetActiveView();
return pView->OnCmdMsg();
CWnd::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
AfxGetApp()->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);