在VC中动态改变菜单的问题

hvq 2001-11-20 10:00:01
为什么在单文档中不能直接用:
CMenu *menu=GetMenu();
menu->EnableMenuItem(ID_APP_ABOUT,MF_GRAYED);
而非要用
void CT7View::OnUpdateAppAbout(CCmdUI* pCmdUI)
{
pCmdUI->Enable(false);
}
...全文
163 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hvq 2001-11-23
  • 打赏
  • 举报
回复
终于解决了,谢谢楼上!!
80分加上!
hense 2001-11-22
  • 打赏
  • 举报
回复
CString str;
CMainFrame* pFreame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
HMENU h = ::GetMenu(pFreame->m_hWnd);
CString str;
CMenu menu;
menu.Attach(h);
CMenu* smenu = menu.GetSubMenu(0);//第几列菜单
ASSERT(smenu);
smenu->GetMenuString(0,str,MF_BYPOSITION);
//假设你要操作的菜单为第0项
if (type == 0) {
smenu->ModifyMenu(0, MF_BYPOSITION,0,str);
smenu->EnableMenuItem(0,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
}
else {
smenu->ModifyMenu(0, MF_BYPOSITION, ID_APP_ABOUT, str);
smenu->EnableMenuItem(0,MF_BYPOSITION | MF_ENABLED);
}
menu.Detach();


以上操作可以达到你的目的,我想可能是M$的问题

kimryo 2001-11-21
  • 打赏
  • 举报
回复
我改为如下任不能执行:(在View中)
HMENU hmenu=::GetMenu((HWND)AfxGetApp()->m_pMainWnd);//hmenu=NULL
EnableMenuItem(hmenu,ID_APP_ABOUT,MF_GRAYED);
蒋晟 2001-11-21
  • 打赏
  • 举报
回复
因为FrameWnd在onidle的时候会自动调用ON_UPDATE_COMMAND_UI更新
hvq 2001-11-21
  • 打赏
  • 举报
回复
怎么没人回答?
hvq 2001-11-21
  • 打赏
  • 举报
回复
我改为如下任不能执行:(在View中)
HMENU hmenu=::GetMenu((HWND)AfxGetApp()->m_pMainWnd);
EnableMenuItem(hmenu,ID_APP_ABOUT,MF_GRAYED);
hvq 2001-11-21
  • 打赏
  • 举报
回复
我试过,还是不好使!
有m_Wndmenu吗?在那?
meng_tenboy 2001-11-21
  • 打赏
  • 举报
回复
CMainFrame* pFreame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CMenu* pmenu=&pFreame->m_Wndmenu(你看一看cmainFrame的create()函数);
pmenu->EnableMenuItem(.....)
firehorizon 2001-11-21
  • 打赏
  • 举报
回复
最好在CMainFrame中控制菜单!
hvq 2001-11-21
  • 打赏
  • 举报
回复
to hense
还是不行!

to ldh
还是不行!

两者合起来也不行!

我的工程是全“下一步”的CFormView的single document!
在View中控制菜单!

难道只能用OnUpdateAppAbout(CCmdUI* pCmdUI)吗?
firehorizon 2001-11-21
  • 打赏
  • 举报
回复
在CMainFrame的构造函数里加一句:m_bAutoMenuEnable = FALSE;
firehorizon 2001-11-21
  • 打赏
  • 举报
回复
学习
hense 2001-11-21
  • 打赏
  • 举报
回复
应该得到SubMenu

CMenu* mmenu = GetMenu();
CMenu* smenu = mmenu->GetSubMenu(0);//第几列菜单
smenu->EnableMenuItem(ID_APP_ABOUT,MF_GRAYED|MF_BYCOMMAND);

BTW:我贴了2遍,最后贴一次,不成功则拉倒!
kimryo 2001-11-20
  • 打赏
  • 举报
回复
1、
CMenu *menu=GetMenu();
这一句要看你在什么地方用,Doc?View?MainFrame。
最好使用::GetMenu((HWND)m_pMainWnd);//

2、
CMenu *menu=GetMenu();
ASSERT(menu);
menu->EnableMenuItem(ID_APP_ABOUT,MF_GRAYED|MF_BYCOMMAND);
试试。
ky640 2001-11-20
  • 打赏
  • 举报
回复
我想是这样的,因为每次菜单是在显示菜单时才处理灰化等界面的操作(可于INSIDE VC++ 6。0看见),而直接用函数来控制没有什么用,因为等到弹出菜单时,就默认执行MFC框架提供的代码,没有执行你的控制代码。(此是愚翁之见,没有仔细去分析MFC的源代码)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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