MFC学习之旅—动态更改菜单

 http://www.cnblogs.com/shijun-china/articles/1429183.html

 

在更改菜单之前,首先要把CMainFrame:: m_bAutoMenuEnable设为FALSE,不然就无法自己更改菜单的样式,而是被MFC自动的设为启动。
    然后用AfxGetMainWnd()得到主窗口的句柄,再调用GetMenu,得到主菜单的指针,但是如果直接用 AfxGetMainWnd()->GetMenu()就会出错,因为用AfxGetMainWnd()得到的是CFrameWnd或其它,是 CMainFrame的父类,要把把强化转化为当前的框架类CMainFrame才可以再获得菜单等其他资源。
CMenu * pmenu = ((CMainFrame *)AfxGetMainWnd())->GetMenu();
    现在pmenu获得的主菜单是整个菜单项,然后用它来调用GetSubMenu()来获取其中的子菜单。自菜单的序号是从0开始的。
CMenu * psub = pmenu->GetSubMenu(0);
    之后就可以用psub来更改子菜单中的按钮的状态了,方法是:
psub->EnableMenuItem(
UINT uIDEnableItem, //菜单项标识
UINT uEnable //控制标志

);

个人觉得常用的控制标志只有3个:

MF_DISABLED —— 禁止
MF_ENABLED ——允许
MF_GRAYED —— 变灰

    比如要让打开菜单项(标志为ID_FILE_OPEN)变灰并且禁用(其实纯变灰了就不能用了),那么语句就是psub->EnableMenuItem(ID_FILE_OPEN, MF_GRAYED | MF_DISABLED);

 给出示例代码:放在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里面的最下面

 1  int  CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
 2  {
 3       if  (CFrameWnd::OnCreate(lpCreateStruct)  ==   - 1 )
 4           return   - 1 ;
 5      
 6       if  ( ! m_wndToolBar.CreateEx( this , TBSTYLE_FLAT, WS_CHILD  |  WS_VISIBLE  |  CBRS_TOP
 7           |  CBRS_GRIPPER  |  CBRS_TOOLTIPS  |  CBRS_FLYBY  |  CBRS_SIZE_DYNAMIC)  ||
 8           ! m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 9      {
10          TRACE0( " 未能创建工具栏/n " );
11           return   - 1 ;       //  未能创建
12      }
13 
14       if  ( ! m_wndStatusBar.Create( this ||
15           ! m_wndStatusBar.SetIndicators(indicators,
16             sizeof (indicators) / sizeof (UINT)))
17      {
18          TRACE0( " 未能创建状态栏/n " );
19           return   - 1 ;       //  未能创建
20      }
21 
22       //  TODO: 如果不需要工具栏可停靠,则删除这三行
23      m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
24      EnableDocking(CBRS_ALIGN_ANY);
25      DockControlBar( & m_wndToolBar);
26 
27      CMainFrame::m_bAutoMenuEnable = false // 重要
28      CMenu  *  pmenu  =   this -> GetMenu();
29      CMenu  *  psub  =  pmenu -> GetSubMenu( 0 );
30       // psub->EnableMenuItem(UINT uIDEnableItem,UINT uEnable);
31       // uEnable have three states below:
32       // MF_DISABLED —— 禁止
33       // MF_ENABLED ——允许
34       // MF_GRAYED —— 变灰
35      psub -> EnableMenuItem(ID_FILE_OPEN, MF_GRAYED  |  MF_DISABLED);
36 
37       return   0 ;
38  }

 

 第28行 为什么是 CMenu * pmenu = this->GetMenu(); 而不是 CMenu * pmenu = ((CMainFrame *)AfxGetMainWnd())->GetMenu() 来得到主menu指针, 具体原因偶再去查查,

望高手指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值