在线等,如何动态修改右键菜单的文本内容? “MF_BYCOMMAND|MF_STRING”是 “MF_BYPOSITION”吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 通常在 WM_INITMENU (WM_INITPOPMENU)中 修改 菜单 项,你 已经到 命令处理 了, menu 可能不存在了。 你在右键菜单生成的过程中不要用菜单资源了,直接用AppendMenu动态生成吧,然后用一个变量记录一下当前菜单到底是“继续”还是“暂停” 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); point 从哪里来的? 你这个是哪个响应函数下的? 我自己定义了一个 cpoint 对象 ,但是 这个菜单跑了啊跑到 屏幕的左上方去了, 而且“继续“那个菜单显示的乱码 》》只能用这一招了么? 如果这样改 我的东西改动很大 。其实问题的关键在于,你定义的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); // 修改 不成功}应该能够实现你所说的,菜单项在继续和暂停之间互换。 求助:OnChar函数判断nChar值的问题 stringtable中换行的问题(EVC 希望高手指点!) CPropertyPage切换事件是什么 自绘控件问题。 CFormview的控件在主框架改变大小闪烁问题 如何将一个网络监听程序做成服务 高手们,开发出拼蔽3721那个对话框的程序吧 新手问题:我在给我的数组分配初始直时,分配一段后说内存不可写,为什么???? cstring日期格式处理 一个关于的高难度问题!!!!高手请进!!!! 有没有工具检测exe中是哪些函数导致UAC弹出,就是图标出现盾牌 MFC怎样实现单文档多视图
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);
point 从哪里来的? 你这个是哪个响应函数下的?
其实问题的关键在于,你定义的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); // 修改 不成功
}
应该能够实现你所说的,菜单项在继续和暂停之间互换。