在SDI程序里面,
我有一个菜单资源IDR_MENU_TEST,如何将这个菜单插入到主菜单里面去?
IDR_MENU_TEST的结构如下
TEST
  -Add
  -Del我用如下代码将IDR_MENU_TEST插入到主菜单
CMenu* pMenu=AfxGetMainWnd()->GetMenu();
CMenu menu;
menu.LoadMenu(IDR_MENU_TEST);
pMenu->InsertMenu(3,MF_POPUP|MF_BYPOSITION ,(UINT_PTR)menu.Detach(),_TEXT("test"));
合并后的菜单会变成这种结构
File    Edit   View   test   Help
                        -TEST-Add
                             -Del
而我希望合并之后的结构是这样
File    Edit   View   TEST   Help
                       -Add
                       -Del
请问如何实现?
在网上搜索了一下,搜索不到好的办法
最笨的办法是通过遍历IDR_MENU_TEST然后一个一个地插上去

解决方案 »

  1.   

    你需要的是将TEST的第一项菜单挂到主菜单上。
    CMenu* pMenu=AfxGetMainWnd()->GetMenu(); 
    CMenu menu; 
    menu.LoadMenu(IDR_MENU_TEST); 
    CMenu *pMenu = menu->GetSubMenu(0);
    pMenu->InsertMenu(3,MF_POPUP|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("TEST")); 
      

  2.   

    其中TEST串你可以从menu中读取,而不是固定编写。应该能满足需要吧
      

  3.   

    插入就意味着成为其子菜单。只能先增加TEST,再插入他的子选项。
      

  4.   

    同意楼上的说法,只能先增加TEST,然后在插入其它的选项
      

  5.   

    CMenu* pMenu=AfxGetMainWnd()->GetMenu(); 
    CMenu menu; 
    menu.LoadMenu(IDR_MENU_TEST); menu.InsertMenu(3,MF_POPUP|MF_BYPOSITION ,(UINT_PTR)menu.Detach(),_TEXT("TEST"));
    CMenu *pMenu = menu->GetSubMenu(3); 
    pMenu->InsertMenu(0,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add"));
    pMenu->InsertMenu(1,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add"));
      

  6.   

    pMenu->InsertMenu(0,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add")); 
    pMenu->InsertMenu(1,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add"));
    这两句的(UINT_PTR)pMenu->Detach()参数应该设置成该菜单项的ID,后面消息响应添加页方便。
      

  7.   

    谢谢快乐鹦鹉.
    问题已经解决.CMenu* pMainMenu=AfxGetMainWnd()->GetMenu();
    CMenu menu;
    menu.LoadMenu(IDR_MENU_TEST);
    CString str;
    menu.GetMenuString(0,str,MF_BYPOSITION);
    CMenu *pSubMenu = menu.GetSubMenu(0);
    pMainMenu->InsertMenu(3,MF_POPUP| MF_BYPOSITION ,(UINT_PTR)pSubMenu->Detach(),str); 
    menu.Detach();
    还有个问题,我有一组ID连续的菜单,我要在菜单弹出来的时候根据某些条件来enable/disable对应的按钮,开始尝试在ON_UPDATE_COMMAND_UI_RANGE里面做对应的事情,但是发现即使你不点TEST菜单, ON_UPDATE_COMMAND_UI_RANGE也会被调用.
    有没有专门的消息响应点击TEST的消息啊?
    点击TEST就会弹出其对应的子菜单
      

  8.   

    汗......
    ON_UPDATE_COMMAND_UI_RANGE消息你是怎么定义的?
    消息的ID是连续的吗?
      

  9.   

    [ID_MENU_APP_FIRST, ID_MENU_APP_LAST]
    ID都在这范围内,但是不一定是连续的.
      

  10.   

    那你不点TEST菜单它怎么会响应呢。这个ID范围内还有其它菜单的ID吧
      

  11.   

    CMenu* pMenu=AfxGetMainWnd()->GetMenu(); 
    CMenu menu; 
    menu.LoadMenu(IDR_MENU_TEST); menu.InsertMenu(3,MF_POPUP|MF_BYPOSITION ,(UINT_PTR)menu.Detach(),_TEXT("TEST")); 
    CMenu *pMenu = menu->GetSubMenu(3); 
    pMenu->InsertMenu(0,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add")); 
    pMenu->InsertMenu(1,MF_STRING|MF_BYPOSITION ,(UINT_PTR)pMenu->Detach(),_TEXT("Add"));
      

  12.   

    我看了一下调用链栈
    好像是在idle的时候会做这些事情
      

  13.   


    我知道是什么原因了
    应该是因为那菜单跟一些toolbar的ID一样