to 米米:照我的理解,你的意思是说
在下面这个函数
void CMyView::OnXXXX() 
{
// TODO: Add your command handler code here
AfxMessageBox("hello from view");
     ……
}
中的省略号处还要调用一个函数吗?那么这函数是什么?
麻烦填填空好吗?

解决方案 »

  1.   

    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太庞大了,全搞懂也没有必要。
      

  2.   

    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有当,作者叫李久进,巧的是,这也是华中理工出的书。
      

  3.   

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