多文档时,主框架和模板用的不是一个菜单,菜单资源的ID相同,名称也相同
当点击其中一个菜单项,比如"拷贝",我想程序在无文档,和有多个文档的情况下
做同样的反映,并保持菜单的状态是一致的(特别是这点不清楚),如点击菜单
“进行拷贝”项,命令为ON_COMMAND命令,对应的处理函数OnCopy(),
在有文档和无文档时都掉这个处理函数。还有:如何在CMainFrame和CView
两个类中获取到当前所加载的菜单的指针?在有、无文档的情况下获取主框架的菜单很容易:
CMainFrame中用AfxGetMainWnd()->GetMenu()->GetSubMenu(?)->?但,在有文档的情况下,如何获取到当前加载的菜单指针并操作?

解决方案 »

  1.   

    这个问题可能描述的混乱,多文档的结构,需要多个菜单支持,默认菜单IDM_MAINFRAME,还有一个是加载文档模板时关联的菜单IDM_OTHER,如果没有打开任何文档时,用的就是默认菜单,而代开某文档就会用到相应的关联菜单IDM_OTHER,我现在的情况是默认菜单IDM_MAINFRAME和IDM_OTHER的菜单项的资源ID是一样的,而且两菜单的菜单结构也差不多一致,我想某菜单项点击和更新时在打开文档和不打开文档保持一致,即不分开处理,并且处理消息的函数均放在CMainFrame这个类里面。我处理上述情况:
    由于获取某一个菜单项的指针比较困难,但MFC提供了UI更新的消息,只要在程序中添加想要处理的菜单项的更新消息响应函数,即可。UI更新的消息:ON_UPDATE_COMMAND_UI
    说明:ON_UPDATE_COMMAND_UI只要是点击到pop菜单(比如File,Edit,Help这些),命令就会触发添加消息映射
    .h文件在宏内添加:
    //{{AFX_MSG(CMultiDocMenuAddView)
    afx_msg void OnUpdateViewToolbar(CCmdUI* pCmdUI);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP().cpp件在宏内添加:
    BEGIN_MESSAGE_MAP(CMultiDocMenuAddView, CView)
    //{{AFX_MSG_MAP(CMultiDocMenuAddView)
    ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateViewToolbar)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()处理函数:
    void CMultiDocMenuAddView::OnUpdateViewToolbar(CCmdUI* pCmdUI) 
    {
    //添加想要的更新状态,如果点击的是一个菜单,CCmdUI入参的成员m_pSubMenu即对应着
    //ID_VIEW_TOOLBAR菜单项,直接操作它就可以了,不需要通过别的函数去获取,比较方便
    }还有另一个消息ON_COMMAND,和ON_UPDATE_COMMAND_UI消息类似,不过是在你点击到某一个
    菜单项(比如File菜单下的Open,Exit等)时触发的,ON_UPDATE_COMMAND_UI应该是在ON_COMMAND
    之前触发,它在菜单下拉之前触发,而ON_COMMAND是在菜单下拉之后,点击到某下拉项时触发,所以如果要更新某菜单项的状态,如被勾选,变灰,不可用等等,都可以在ON_UPDATE_COMMAND_UI关联的
    处理函数中处理。现在,我的问题就是通过这两消息关联来进行处理。
    由于我还要同时处理两个菜单项情况,于是用了一个成员变量来保存其中一个菜单的选择状态,一个值对应一个菜单进行的处理,其中ON_COMMAND命令处理函数里赋值给变量,ON_UPDATE_COMMAND_UI命令处理函数通知更新菜单项的状态,达到我的目的。可能大家还有更好的方法,欢迎发表意见。