如何实现菜单的动态切换?
    
    在MDI程序中,我有两个主菜单(下拉式的)文件  和 编辑(平行的) ;它们下面各自有两个菜单:
ID_FILE_ONE 打开文件一 
ID_FILE_TWO 打开文件二ID_EDT_ONE  //含义如下:
ID_EDT_TWO // 注意:当用户在文件菜单中先选择了 ID_FILE_ONE 时,两个编辑菜单分别显示为: 拷贝 和 粘贴            并且实现相应的编辑功能!(同时显示文件一的内容)           当用户在文件菜单中选择了 ID_FILE_TWO 时, 两个编辑菜单分别显示为: 向前翻-页 和 向后翻一页 并且实现相应的翻页功能!(同时显示文件二的内容)我想实现上面所说的,菜单的动态切换功能,(编辑菜单的位置相同,但是在用户选择不同的,文件选项后,编辑菜单的内容能个动态的切换,并且实现相应的功能)我只是把我的问题打个比方,希望实现类似的功能,希望大家帮忙!

解决方案 »

  1.   

    你的问题就是说 用户不同的选择 就有不通的响应(虽然是其他控件)
    显示我觉得是不难的
    多设置个flag表示现在的状态 然后根据状态 选择性的装载。
      

  2.   

    先创建好ID_EDIT_ONE1....的消息映射关系
    ,然后
    OnCommandFileTwo()
    {
      CMenu *pMenu=GetMenu();
      pMenu->ModifyMenu(ID_EDT_ONE1, MF_BYCOMMAND|MF_STRING,ID_EDIT_ONE2,"编辑"); 
      pMenu->ModifyMenu(ID_EDT_TWO1, MF_BYCOMMAND|MF_STRING,ID_EDIT_TWO2,"编辑");
    }OnCommandFileOne()
    {
      CMenu *pMenu=GetMenu();
      pMenu->ModifyMenu(ID_EDT_ONE2, MF_BYCOMMAND|MF_STRING,ID_EDIT_ONE1,"向前"); 
      pMenu->ModifyMenu(ID_EDT_TWO2, MF_BYCOMMAND|MF_STRING,ID_EDIT_TWO1,"向后");
    }
    我也是没有经过测试的
    参考MSDN
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cmenu_class_members.asp
      

  3.   

    pMenu->ModifyMenu(ID_EDT_ONE2, MF_BYCOMMAND|MF_STRING,ID_EDIT_ONE1,"向前"); 
    这里MF_BYCOMMAND|MF_STRING也不知道对不对
    如果不对
    可用MF_BYCOMMAND替代
      

  4.   

    请问: hahuID_EDT_ONE1
    ID_EDT_TWO1,
    ID_EDT_ONE2
    ID_EDT_TWO2,
    是怎么定义的?调试一下吧?很快的!!!我得分很多!!!
      

  5.   

    最重要的是功能的实现!如何区分各自的功能??难道非要用bTag不可吗???
      

  6.   

    就是定义菜单
    ID_EDT_ONE1 拷贝
    ID_EDT_TWO1 粘贴
    ID_EDT_ONE2 向前翻页
    ID_EDT_TWO2 向后翻页
    通过类向导生成他们对应的函数
    然后删除刚开始不用的两个
      

  7.   

    删除菜单,不是对应函数
    这些ID,和消息映射VC可能会保存
      

  8.   

    也可以直接定义宏,然后自己添加消息处理函数
    #define ID_EDIT_ONE1   100在头文件中
    void OnEditOne1();在cpp文件中的
    END_MESSAGE_MAP()
    之前加入
    ON_COMMAND(ID_EDIT_ONE1, OnEditOne1)
    然后实现该函数
      

  9.   

    加入一个菜单资源
    加入一个UPDATE_COMMAND_UI消息
    if(bFlag)
    {
    CMenu *pMenu=GetMenu();
    if(pMenu)
    {
    CMenu popMenu;
    popMenu.LoadMenu(IDR_MENU2);
    CMenu* popMenu2=popMenu.GetSubMenu(0);
    pMenu->ModifyMenu(ID_HELLO,MF_POPUP,(UINT)popMenu2->GetSafeHmenu(),"&Popup");
    }
    }
    }