希望动态的设置菜单显示的文本,程序中有好几个菜单是弹出式菜单
        m_pMenu->LoadMenu(IDR_MAINFRAME);
if(m_pMenu == NULL)
{
MessageBox("menu is null");
return 0;
}
for(int iIndex=0;iIndex<m_pMenu->GetMenuItemCount();iIndex++)
{
CString info;
m_pMenu->ModifyMenu(iIndex,MF_BYPOSITION|MF_STRING,iIndex,"helloworld");
m_pMenu->GetMenuString(iIndex,info,MF_BYPOSITION);
MessageBox(info);
}
改完之后我马弹出对话框,刚弹出的是正确的,可是显示出来的又是原来的,怀疑修改后没有保存,或者修改的只是一个临时CMenu对象,而没有修改真正的资源文件。
如何能修改LoadMenu得到的菜单呢!!

解决方案 »

  1.   

    m_pMenu->GetSubMenu(0)->ModifyMenu
      

  2.   

    CMenu * pMenu = new CMenu();
    pMenu->LoadMenu(IDR_MAINFRAME);
    CString info;
    pMenu->ModifyMenu(0,MF_BYPOSITION|MF_STRING,0,"fdas");//尝试修改
            //好像这里缺一个保存修改。。
    pMenu->GetMenuString(0,info,MF_BYPOSITION);//
    MessageBox(info);//打印刚修改的值--提示fdas CMenu * pMenu1 = new CMenu();
    pMenu1->LoadMenu(IDR_MAINFRAME);//换一个对象重新加载
    pMenu1->GetMenuString(0,info,MF_BYPOSITION);
    MessageBox(info);//打印相同位置,结果是  --- "文件&F"  修改失败----
      

  3.   

    CMenu * pMenu1 = new CMenu(); 
    pMenu1->LoadMenu(IDR_MAINFRAME);//换一个对象重新加载 
    pMenu1->GetMenuString(0,info,MF_BYPOSITION); 
    MessageBox(info);//打印相同位置,结果是  --- "文件&F"  修改失败----
    ========================
    楼主没有弄明白ModifyMenu的作用,这个是动态修改,并不是修改资源文件,而是指在运行中修改,资源文件中的菜单根本就没变
      

  4.   

    如果不使用LoadMenu获得菜单指针对象,而是通过GetMenu获得,则修改成功。但是GetMenu需要一个句柄,如果该菜单不是系统菜单,而是一个仅仅知道ID的弹出式菜单,随处可能出现的菜单,如何才能动态的控制它呢?
      

  5.   

    如果不使用LoadMenu获得菜单指针对象,而是通过GetMenu获得,则修改成功
    ====================
    你的成功指什么,菜单资源被改了吗?不可能吧
      

  6.   

    回楼上:菜单资源被修改了,你可以试试看,是在CMainFram类的OnCreate函数中调用GetMenu,修改其返回的CMenu对象,然后应用程序显示的是修改后的菜单
      

  7.   

    运行时修改是动态修改,改的并不是资源,而是这个菜单对象,资源应该是EXE文件的一部分,相当于代码一样,是不可能在运行时被自己修改的。另外你用GetMenu修改的也不是资源文件
      

  8.   

    菜单资源是否修改,你可以打开资源管理器看看,不可能的。你程序中修改的东西,不会影响源码。再怎么改,最后重新编译链接,还是原来的。我看明白了你上面的意思,你用LoadMenu加载的菜单,和窗口上已有的菜单不是一回事儿,是两个不同的实例;而用GetMenu获取的,才是窗口上已有的菜单,不知道是不是这个意思。
      

  9.   

    如果要修改二进制可执行程序中的资源,可以用FindResource/LockResource/BeginUpdateResource/UpdateResource/EndUpdateResource这一系列资源管理API,具体看看MSDN。
      

  10.   

    把CMenu * pMenu1 作为成员变量,不要用临时变量,初始化new,LoadMenu,Modify完之后就不要动了,程序退出时再释放。你每次都从资源加载,前面的修改都白费了。
      

  11.   

    把CMenu * pMenu1 作为成员变量,不要用临时变量,初始化new,LoadMenu,Modify完之后就不要动了,程序退出时再释放。你每次都从资源加载,前面的修改都白费了。
    =======================================
    我试过给CMainFrame类添加CMenu*对象,构造函数里面new,析构函数里面Delete,但是依然没有修改--正在尝试12楼的方法
      

  12.   

    局部变量,可以将menu变成类的成员变量,或静态变量,试看看
      

  13.   


    晕,你不会在构造函数里new了就修改吧?那时候窗口都还没创建呢,这样子,构造函数里给这个pMenu赋值为NULL,然后你上面的代码这么改:if(pMenu == NULL)
    {
       pMenu = new CMenu(); 
       if(pMenu->LoadMenu(IDR_MAINFRAME))
       {
          CString info; 
          pMenu->ModifyMenu(0,MF_BYPOSITION|MF_STRING,0,"fdas");//尝试修改 
           pMenu->GetMenuString(0,info,MF_BYPOSITION);// 
          MessageBox(info);//打印刚修改的值--提示fdas
       }
       else
          MessageBox("加载菜单失败"); 
    }
      

  14.   


    GetMenu能修改成功是因为系统已经载入了菜单(程序结束才释放),你修改的是内存中的数据并不是修改Exe文件中的菜单资源。
    LoadMenu每一都需要从资源中重新生成菜单,如果你要达到你的功能那么LoadMenu 生成的菜单需要作为类的成员,并且在程序结束才释放。