菜单项不能变灰的问题

zufei 2009-12-18 09:44:53
该弹出菜单不能根据条件来使菜单变灰!
void CMainFrame::OnRclickTree(NMHDR* pNMHDR, LRESULT* pResult) //树表项右键单击处理函数
{
if(m_wndTree.GetCount() && m_wndTree.GetSelectedItem())
{
CMenu xpMenu;
POINT point;
GetCursorPos(&point);
VERIFY(xpMenu.LoadMenu(IDR_MENU_DOC)); //这里是在菜单资源做的
CMenu *menu=(CMenu*)xpMenu.GetSubMenu(0);
UINT nEnable;
HTREEITEM hItem=m_wndTree.GetSelectedItem();
int nIsDoc=m_wndTree.GetItemData(hItem);
if(nIsDoc!=-1) //根据这个条件来激活菜单项
{
nEnable = MF_BYCOMMAND | MF_ENABLED;
}
else
{
nEnable = MF_BYCOMMAND | MF_GRAYED;
}
menu->EnableMenuItem(ID_MENU_OPEN, nEnable); //问题是,这堆都无反应!不能变灰色
menu->EnableMenuItem(ID_MENU_ADD, nEnable);

menu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this, NULL);
xpMenu.DestroyMenu();
}
*pResult = 0;
}
...全文
160 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwsn007 2009-12-20
  • 打赏
  • 举报
回复
是不是ID_MENU_OPEN这个宏有问题,试试别的菜单项
xwsn007 2009-12-20
  • 打赏
  • 举报
回复
奇怪!改代码为:
menu->EnableMenuItem(ID_MENU_OPEN, 1); 看看结果如何?
zufei 2009-12-20
  • 打赏
  • 举报
回复
顶!!!!!!

zufei 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chenlycly 的回复:]
一般给菜单项添加响应函数,一般有两种Message Type可以选择:Command和Update_Comannd_UI,要想实现你的效果只要为你指定的菜单项添加Update_Comannd_UI类型的响应函数即可:
C/C++ code
ON_UPDATE_COMMAND_UI(ID_MENU_OPEN,&CMainFrame::OnUpdateMenuOpen);//消息映射......void CMainFrame::OnUpdateMenuOpen(CCmdUI*pCmdUI)//响应函数{
pCmdUI->Enable(m_bMenuOpenFlag);//此处用Enable函数就可实现了,只要设置标记变量m_bMenuOpenFlag(bool类型变量)}
[/Quote]

先谢谢你的答案!

我也觉得coyer兄的有道理,只想找出究竟是什么原因!
我仔细调试过,当选择不同的条件时:
nEnable = MF_BYCOMMAND | MF_ENABLED; //该nEnable=0;
nEnable = MF_BYCOMMAND | MF_GRAYED; //该nEnable=1;

menu->EnableMenuItem(ID_MENU_OPEN, nEnable); //该函数返回0;
弹出的菜单总是激活的,不变灰!
Ryanwen 2009-12-19
  • 打赏
  • 举报
回复
//先把条件选择注释掉,保留下面这条语句,确认你确实执行了这条语句
nEnable = MF_BYCOMMAND|MF_GRAYED|MF_DISABLED;
coyer 2009-12-19
  • 打赏
  • 举报
回复
你的代码很有可能是对的,再仔细调调,应该能找出不能变灰的问题。

至于楼上有些人说使用 OnCommandUpdateUI 这种方法,我认为不太适合楼主,因为楼主使用的TracePopupMenu,不是固定的菜单,我没有用过这种方式,也许我的观点不对。
dvlinker 2009-12-19
  • 打赏
  • 举报
回复
上述方法一般只用于SDI或MDI工程中,若要应用于对话框工程时,应添加额外的代码,才能在对话框工程中起到应有的效果。
dvlinker 2009-12-19
  • 打赏
  • 举报
回复
当m_bMenuOpenFlag = FALSE时,对应菜单就会变灰,当m_bMenuOpenFlag = TRUE时,对应菜单就会变成可操作的状态。
只要在需要改变菜单状态的时候,给标记变量m_bMenuOpenFlag赋TRUE或FALSE就可以了。
dvlinker 2009-12-19
  • 打赏
  • 举报
回复
一般给菜单项添加响应函数,一般有两种Message Type可以选择:Command和Update_Comannd_UI,要想实现你的效果只要为你指定的菜单项添加Update_Comannd_UI类型的响应函数即可:

ON_UPDATE_COMMAND_UI(ID_MENU_OPEN, &CMainFrame::OnUpdateMenuOpen);//消息映射
......

void CMainFrame::OnUpdateMenuOpen(CCmdUI *pCmdUI)//响应函数
{
pCmdUI->Enable(m_bMenuOpenFlag);//此处用Enable函数就可实现了,只要设置标记变量m_bMenuOpenFlag(bool类型变量)
}
zufei 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenlycly 的回复:]
用ON_UPDATE_COMMAND_UI机制就可以很好的实现
[/Quote]

请问用该方法怎么实现?可否给个例子!

我在这里再补充一下,该代码在对话框程序中应用是可以的,把它改到多文档应用中就出问题!
wbfldxm 2009-12-19
  • 打赏
  • 举报
回复
2L
hzy694358 2009-12-19
  • 打赏
  • 举报
回复
else
{
nEnable = MF_BYCOMMAND | MF_GRAYED;
}
设断点,看有么有进这条语句
cdpc0202 2009-12-18
  • 打赏
  • 举报
回复
MF_DISABLED|MF_GRAYED 加上MF_DISABLED
dvlinker 2009-12-18
  • 打赏
  • 举报
回复
用ON_UPDATE_COMMAND_UI机制就可以很好的实现
WaistCoat12 2009-12-18
  • 打赏
  • 举报
回复
你确认你的EnableMenuItem的nEnable参数=MF_BYCOMMAND | MF_GRAYED?

15,979

社区成员

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

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