CMFCPopupMenu 禁止菜单条目

DavidHsing 2008-10-31 03:19:22
在基于 CDialog 的程序中使用 VS 2008 sp1,想套用 CMFCPopupMenu。

void ...
{
CMenu muPopupMenu;
muPopupMenu.LoadMenu(IDM_LIST_POPUP_MENU);
if (muPopupMenu.GetSafeHmenu())
{
CMenu* pPopupMenu = muPopupMenu.GetSubMenu(0);
if (pPopupMenu != NULL && pPopupMenu->GetSafeHmenu())
{
pPopupMenu->EnableMenuItem(ID_XXX, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);
}
CPoint ptPoint(GetMessagePos());

//原来的处理办法
//pPopupMenu->TrackPopupMenu(TPM_LEFTBUTTON, ptPoint.x, ptPoint.y, this);

//改造的处理办法
CMFCPopupMenu* pMFCPopupMenu = theApp.GetContextMenuManager()->ShowPopupMenu(pPopupMenu->Detach(), ptPoint.x, ptPoint.y, this, TRUE);
}
muPopupMenu.Detach();
muPopupMenu.DestroyMenu();
}


现在的问题是:
即使我这里已经 EnableMenuItem 了,而且 ShowPopupMenu 显示出来的也是灰色的,
但是居然还能用鼠标点击!!
而且在鼠标按下的时候,明显看到原本变灰的字变成了正常的黑色,而且居然还能响应菜单的点击时间!
太不可思议了!

各位有碰到过这样的情况么?
...全文
302 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
DavidHsing 2008-11-03
  • 打赏
  • 举报
回复
嗯,呵呵,我已经知道了,
可以响应 ON_UPDATE_COMMAND_UI_RANGE 消息。
不过挺纳闷的是为啥之前用 CMenu::TrackPopupMenu 不需要响应 ON_UPDATE_COMMAND_UI 或者 ON_UPDATE_COMMAND_UI_RANGE 消息呢?()
我没有打勾等操作,直接在 TrackPopupMenu 之前 EnableMenuItem 就可以了。

这个 NewMenu 我也早注意到了,只是我不喜欢带个 dll 发布。
不知道可不可以在 OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu)
中将参数 CMenu* 换成 CMFCPopupMenu*,
我再试试看。
abesky 2008-11-02
  • 打赏
  • 举报
回复
你需要响应WM_INITMENUPOPUP消息,在消息内再次更新一下菜单状态.具体做法参见
http://www.codeproject.com/KB/menus/newmenuxpstyle.aspx

15,979

社区成员

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

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