,怎么动态修改右键菜单的文本内容
我在 右键菜单的 第三个子菜单的响应函数 里想修改它的文本内容
可就是不成功 ,但可以获取 很奇怪
void CMenuView::OnContinue()
{
CMenu menu;
CString *pText=new CString;
menu.LoadMenu(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0); //得到菜单项
UINT itemID=pPopup->GetMenuItemID(2);//获取第三个子菜单的ID
pPopup->GetMenuString(2,*pText,MF_BYPOSITION);//获取第三个子菜单的文本
MessageBox(*pText); // 一直显示“继续”
*pText="暂停";
pPopup->ModifyMenu(2,MF_BYCOMMAND|MF_STRING,itemID,(LPSTR)pText); // 修改 不成功
}
每次都弹出 继续 ,一直修改不成功 。这是为什么呢? 求帮助。。
------解决方案--------------------
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);
------解决方案--------------------
其实问题的关键在于,你定义的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); // 修改 不成功
}
应该能够实现你所说的,菜单项在继续和暂停之间互换。