更改消息路由Command

来源:互联网 发布:php 阿里大于短信接口 编辑:程序博客网 时间:2024/05/27 06:12

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);

原创粉丝点击