更改消息路由Command

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值