“MF_BYCOMMAND|MF_STRING”是 “MF_BYPOSITION”吧

解决方案 »

  1.   

    通常在 WM_INITMENU (WM_INITPOPMENU)中 修改 菜单 项,你 已经到 命令处理 了, menu 可能不存在了。
      

  2.   

    你在右键菜单生成的过程中不要用菜单资源了,直接用AppendMenu动态生成吧,然后用一个变量记录一下当前菜单到底是“继续”还是“暂停”
      

  3.   

    VS2005上试过的。 CMenu menu;
    CString *pText=new CString;
    menu.LoadMenu(IDR_MENU);
    CMenu* pPopup = menu.GetSubMenu(0);  //得到菜单项
    UINT itemID=pPopup->GetMenuItemID(0);//获取第三个子菜单的ID pPopup->GetMenuString(0,*pText,MF_BYPOSITION);//获取第三个子菜单的文本
    MessageBox(*pText);   // 一直显示“继续”   *pText=_T("暂停");
    pPopup->ModifyMenu(0,MF_BYPOSITION|MF_STRING,itemID,*pText);  // 修改  不成功 ClientToScreen(&point);
    pPopup->TrackPopupMenu(
    TPM_LEFTALIGN | TPM_RIGHTBUTTON,
    point.x, point.y, this);
      

  4.   


    point 从哪里来的?  你这个是哪个响应函数下的?
      

  5.   

    我自己定义了一个 cpoint 对象 ,但是 这个菜单跑了啊跑到 屏幕的左上方去了, 而且“继续“那个菜单显示的乱码 
      

  6.   

    》》只能用这一招了么? 如果这样改 我的东西改动很大 。
    其实问题的关键在于,你定义的CMenu这个变量是一个临时变量,你的修改其实起了作用,但是这个函数结束之后,CMenu这个变量生命期到了就没了,你再点右键,又从新生成一个CMenu变量,重新从资源中LoadMenu,所以你前面的修改就起不到作用了。
    如果你非要从资源中加载菜单,那么可以这样做:
    一、将CMenu menu改为CXXXView类加一个成员变量。在CXXXView类的OnInitialUpdate()中调用LoadMenu,代码如下:
    void CMy11View::OnInitialUpdate()
    {
    CView::OnInitialUpdate(); menu.LoadMenu(IDR_MENU1);//装载自定义的右键菜单 
    }
    二、修改一下右键处理函数,将里面的LoadMenu去掉。代友如下:
    void CMy11View::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
    {
       CMenu *pSubMenu;//定义下面要用到的cmenu对象
     // menu.LoadMenu(IDR_MENU1);//装载自定义的右键菜单     pSubMenu=menu.GetSubMenu(0);//获取第一个弹出菜单,所以第一个菜单必须有子菜单  
       CPoint oPoint;//定义一个用于确定光标位置的位置  
       GetCursorPos(&oPoint);//获取当前光标的位置,以便使得菜单可以跟随光标  
       pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); 
    }
    三、修改一下菜单处理函数:
    void CMy11View::On32771()
    {
    CString pText;
    CMenu* pPopup = menu.GetSubMenu(0);  //得到菜单项
    UINT itemID=pPopup->GetMenuItemID(0);//获取第三个子菜单的ID
    pPopup->GetMenuString(0,pText,MF_BYPOSITION);//获取第三个子菜单的文本
    if(pText==_TEXT("继续"))
    pText=_TEXT("暂停");
    else pText=_T("继续");
    pPopup->ModifyMenu(0,MF_BYPOSITION|MF_STRING,itemID,pText);  // 修改  不成功
    }
    应该能够实现你所说的,菜单项在继续和暂停之间互换。