关于侯老师的第九章《消息映射和命令传递》的有一定代表性的问题

lzhljylg 2001-04-22 10:45:00
点击菜单中的某项时,命令会依次从View->Frame->doc再流向app,期间只要上面任何一个环节处理了这个消息,那么这次命令传递就会中止。

为了进一步理解这个传递过程(我正在学习的侯老师的第九章《消息映射和命令传递》的内容),我想设计这样一个过程:

当我点击某项菜单命令时,我想在以上的四个环节中都响应这个命令,而不是只响应其中一个环节,也就是当点击完菜单后,依次出现四个MessageBox,上面分别写着:
1.hello from view
2.hello from frame
3.hello from doc
4.hello from app

well,现在的问题是:如果不加特别处理,那么即使在那四个类中分别加入响应函数,也会只在处理完第一个Box以后,就没了下文,所以,该如何进行这个特别处理呢?



再说说我的关于这个问题的一点猜测:在命令消息最后的处理函数中,如果做了处理,那么就return一个TRUE,否则就FALSE.如果做了处理还传回一个FALSE,那么
传递过程就还会继续--这样自然就实现了原问题的解决,这也是我最开始的想当然,但恼火的是,那些最后的处理函数如:CMyView::OnXXXX()(由classwizard自动生成),却都是无返值的void型函数……


各位大侠请了!
...全文
117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcbear 2001-04-26
  • 打赏
  • 举报
回复
1.是正确的。

2.你应该重载CMainFrame里的OnCommand,这样就可以了。我不认为CDocment等这些无窗口的
类是消息的主动接收者,即使他们里面有消息影射函数,也是由CMainFrame窗口响应后,查询
影射表得到函数地址来调用的。如果你真的想要实现DOC,VIEW里也能运行函数,不如自己在
CMainFrame里显性调用,既然已经知道了由OnCmdMsg统一调度消息处理,为什么自己不能写,
原理是一样的,何必钻到MFC的牛角尖里。

3.看书固然好,有空要看看MFC源码,如果你真的想研究透MFC的话。反正我对DOC/VIEW的架构
没有什么兴趣。
lzhljylg 2001-04-26
  • 打赏
  • 举报
回复
to VCBear:
我反复考虑了你的答复,也翻了一些资料,得出以下一些结论:
1.在一般情况下(比如程序中若没有出现那种带菜单的对话框等),命令消息绝对通通是先传给
主框架窗口,然后,在主框架窗口的OnCmdMsg()分发,此前,命令消息的流向没有分支。
2.通过重载来实现目的,这条思路整个都是不通的。我整整花了两天的时间来思考如何重载,但无论是重载OnCommand还是重载view或frame的OnCmdMsg,都不能完整实现或根本不能实现。你可以试试看。若重载view的OnCmdMsg,则可以做到view处理完以后frame再处理一次,但doc和app则永远到不了!--除非去改动类库中CFrameWnd、CView、CDocment、CDocTemplate、CWinApp等类各自的OnCmdMsg函数的源码。(这里又有一个新问题,真要非得去改动类库的源码才能实现程序的话,怎么办?)
3.我通过另外一个映射宏实现了这个目的!这个宏是ON_COMMAND_EX。这个宏的用法和OM_COMMAND的用法完全一致,只是必须手工添加,而且对应的处理函数必须是BOOL型的,另外它还有一个UINT参数。--我是在《mfc深入浅出》中找到这个用法的,千万注意这不是老侯那本,这书在vchelp有当,作者叫李久进,巧的是,这也是华中理工出的书。

lzhljylg 2001-04-26
  • 打赏
  • 举报
回复
非常感谢!!!
vcbear 2001-04-25
  • 打赏
  • 举报
回复
NND,跟踪MFC跟S俺了,谁叫我这么菜。
这个WM_COMMAND消息的处理涉及CMainFrame ,涉及CWnd,又涉及 OnCmdMsg,涉及
wincore.h....有汇编,有Afx,有switch,有函数指针,最后得到:
_AfxDispatchCmdMsg里的(pTarget->*mmf.pfn_COMMAND)()终于回到你定义
的在view里的函数。

在一个WM_COMMAND流程中,CMainFrame会先响应,先找CView里的Message Map Entry,
如果找到了就运行CView里的函数,如果找不到就会到CCmdTarget里去查更大的一张
MSG表(全是汇编),找的到你定义的消息影射函数就运行。

你还是在CMainFrame里重载OnCommand吧。MFC太庞大了,全搞懂也没有必要。

lzhljylg 2001-04-23
  • 打赏
  • 举报
回复
to 米米:照我的理解,你的意思是说
在下面这个函数
void CMyView::OnXXXX()
{
// TODO: Add your command handler code here
AfxMessageBox("hello from view");
     ……
}
中的省略号处还要调用一个函数吗?那么这函数是什么?
麻烦填填空好吗?
horris 2001-04-23
  • 打赏
  • 举报
回复
你只能重载OnCommand了
fulaoxiao 2001-04-22
  • 打赏
  • 举报
回复
在每个环节,显示消息框后,调用下一环节的相应函数。
我在VC6下已试过了,可行。
cnss 2001-04-22
  • 打赏
  • 举报
回复
学习

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧