关于修改菜单的文字信息?

zorrowang 2003-04-03 11:46:04
小弟写了一个托盘程序,想要修改其弹出菜单一项的文字,即点击后下次再看菜单,该项的文字变化了,

if(!bMonitored)
pPopup->ModifyMenu(IDC_MONITOR, MF_BYPOSITION | MF_STRING | MF_OWNERDRAW, 0, "停止监控");
else
pPopup->ModifyMenu(IDC_MONITOR, MF_BYPOSITION | MF_STRING | MF_OWNERDRAW, 0, "开始监控");

不知道上面写的冬冬对不对,应当加在哪?我试着加在处理托盘的右键的事件里,但是没有起作用,
...全文
877 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zorrowang 2003-04-04
  • 打赏
  • 举报
回复
//处理系统托盘上的鼠标消息
LRESULT CPSAgentDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
if(bBusy) return 0;//正在更新,则忽略鼠标

if(lParam == WM_RBUTTONDOWN){
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU1));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
POINT pt;
GetCursorPos(&pt);
pPopup->TrackPopupMenu(TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());
if(bMonitored)
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "停止监控");
else
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "开始监控");

}//end if
return LRESULT(0);
}
//处理点击菜单项的函数
void CPSAgentDlg::OnMenuMonitor()
{
bMonitored = !bMonitored;
MonitorIE();
}
//根据菜单项改变托盘图标和提示信息
void CPSAgentDlg::MonitorIE()
{
if(bMonitored){
SetTray(IDI_MONITORED,"信息代理§正在监控");
SetCapture();
}
else{
SetTray(IDI_DISMONITORED,"信息代理§暂停监控");
ReleaseCapture();
}
}
//修改托盘图标和信息的函数
void CPSAgentDlg::SetTray(int nWhichIcon, CString sStatus)
{
m_nTrayData.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(nWhichIcon));
strcpy(m_nTrayData.szTip,sStatus);
m_nTrayData.uFlags = NIF_ICON|NIF_TIP;
Shell_NotifyIcon(NIM_MODIFY,&m_nTrayData);
}

上面是小弟的主要的相关的函数,bMonitored是一个BOOL变量,按照这样的话,点击了菜单后只是托盘图标和信息变化,而菜单文字不变,请问是怎么回事?
ukyoking 2003-04-04
  • 打赏
  • 举报
回复
up
zorrowang 2003-04-04
  • 打赏
  • 举报
回复
这样改就对了
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU1));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
POINT pt;
GetCursorPos(&pt);
if(bMonitored)
pPopup- >ModifyMenu(IDC_MONITOR, MF_BYCOMMAND ¦MF_STRING , IDC_MONITOR, "停止监控 ");
else
pPopup- >ModifyMenu(IDC_MONITOR, MF_BYCOMMAND ¦MF_STRING , IDC_MONITOR, "开始监控 ");
pPopup- >TrackPopupMenu(TPM_RIGHTALIGN ¦TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());

zhdleo 2003-04-04
  • 打赏
  • 举报
回复
有遗漏吧!

LRESULT CPSAgentDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
if(bBusy) return 0;//正在更新,则忽略鼠标

if(lParam == WM_RBUTTONDOWN){
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU1));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup!=NULL);
POINT pt;
GetCursorPos(&pt);
pPopup->TrackPopupMenu(TPM_RIGHTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());
if(bMonitored)
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "停止监控");
else
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "开始监控");

}//end if
return LRESULT(0);
}

看看你里面的那几个BOOL型的判断标记,
光有判断,没有更改,下次怎么办?

比如bMonitored要先初始化。
if(bMonitored)
{
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "停止监控");
bMonitored = false; //****这个
}
else
{
pPopup->ModifyMenu(IDC_MONITOR, MF_BYCOMMAND|MF_STRING , 0, "开始监控");
bMonitored = ture; //****这个
}
}//end if

用户 昵称 2003-04-04
  • 打赏
  • 举报
回复
楼主的代码是错误的

if(!bMonitored)
pPopup->ModifyMenu(IDC_MONITOR, MF_BYPOSITION | MF_STRING | MF_OWNERDRAW, 0, "停止监控");
else
pPopup->ModifyMenu(IDC_MONITOR, MF_BYPOSITION | MF_STRING | MF_OWNERDRAW, 0, "开始监控");

IDC_MONITOR是一个命令,所以需要用MF_BYCOMMAND修改
zhdleo 2003-04-04
  • 打赏
  • 举报
回复
学习。

不过楼主是改变菜单的内容呀。
用户 昵称 2003-04-04
  • 打赏
  • 举报
回复
// resource string ID
SendMessage(WM_SETMESSAGESTRING, ID_MYSTRING);

// string
SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)_T("Hello, world"));

所以,如果要实现动态菜单提示,必须重载CFrameWnd::OnMenuSelect和 用提示串发送WM_SETMESSAGESTRIN消息。

void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags,
HMENU hSysMenu)
{
if (/* nItemID has a dynamic prompt */) {
CString sPrompt = // whatever you want
SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)(LPCTSTR)sPrompt);
m_nIDTracking = nItemID;
} else {
CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
}
}
zhdleo 2003-04-03
  • 打赏
  • 举报
回复
比如:
void CTrayDlg::OnProc(WPARAM wParam,LPARAM lParam)
{
UINT uMouseMsg;//鼠标动作
uMouseMsg=(UINT) lParam;

if(uMouseMsg==WM_LBUTTONDOWN)
{

ATOM GlobalAtom;
if(!GlobalFindAtom("Aboutc"))
{
GlobalAtom=GlobalAddAtom("Aboutc");

//弹出About对话框
CAboutDlg dlg;
dlg.DoModal();

GlobalDeleteAtom(GlobalAtom);
}

}
if(uMouseMsg==WM_RBUTTONDOWN)
{
AfxGetMainWnd()->SetForegroundWindow(); //弹出Popup菜单
CMenu menu;
menu.LoadMenu(IDR_TRAYMENU);
CMenu* pPopup=menu.GetSubMenu(0);
CPoint Point;
GetCursorPos(&Point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL );
AfxGetMainWnd()->PostMessage(WM_NULL, 0, 0);

//***这里吧
//因为这个是你每次弹出菜单都要做的事情,
//根据你的 bMonitored来判断,我想你的本意也是这样。

}
}
zhdleo 2003-04-03
  • 打赏
  • 举报
回复
pPopup是个CMenu *吧。

写的ModifyMenu我想没有问题。

关键是怎么用。


如果你的bMonitored是一个用来判断的标记就行。

用在。。。。。。
响应你的菜单弹出之后,紧跟着。应该是

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧