1 菜单栏选项的打勾,加粗,禁用

首先我们需要知道菜单栏包含子菜单栏,依次使用下标去区分。然后拿到子菜单栏后,就可以操作里面的选项了。可以通过下标,选项的ID(在资源视图的菜单栏的图,点击选项右击属性即可获取)进行操作。

代码:
由于为了减少视图的工作量,并且根据上一篇菜单栏的消息路由,框架也可以处理菜单栏的消息,所以代码放在框架类的OnCreate处理,注意,是操作菜单栏本身的选项时放在菜单栏处理,当处理菜单栏里面选项的左中右键按下时,尽量放在视图处理,否则框架可能无法捕获,但是菜单栏的变量需要重新定义,不要Get获取菜单栏,否则出错。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1;      // 未能创建}if (!m_wndStatusBar.Create(this)){TRACE0("未能创建状态栏\n");return -1;      // 未能创建}m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));// TODO: 如果不需要可停靠工具栏,则删除这三行m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);//1 获取菜单栏CMenu *menu = GetMenu();//2 获取第一个子菜单栏,0代表下标CMenu *submenu = menu->GetSubMenu(0);//3 操作子菜单中的选项//1) 添加勾勾submenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);//下标法submenu->CheckMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_CHECKED);//ID法,需要去菜单栏拿取选项的ID并且参1改为命令宏,是对应使用的//2)让选项加粗(设置默认项),注意一个菜单栏只能有一个加粗,所以最后3将覆盖2加粗submenu->SetDefaultItem(2, TRUE);submenu->SetDefaultItem(3, TRUE);//3) 禁用选项,使选项变灰(注意分界线也算一个下标选项)CFrameWnd::m_bAutoMenuEnable = false;//这句一般放构造处理submenu->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED);return 0;
}

结果可以看到,0,1打上勾。2被3覆盖加粗。4为分界线不需要处理。5被禁用了即打印。

2 菜单栏的移除与加载自定义的菜单栏

我们在上面的例子中继续添加代码即可。重复的代码可以不用看。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1;      // 未能创建}if (!m_wndStatusBar.Create(this)){TRACE0("未能创建状态栏\n");return -1;      // 未能创建}m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));// TODO: 如果不需要可停靠工具栏,则删除这三行m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);//1 获取菜单栏CMenu *menu = GetMenu();//2 获取第一个子菜单栏,0代表下标CMenu *submenu = menu->GetSubMenu(0);//3 操作子菜单中的选项//1) 添加勾勾submenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);//下标法submenu->CheckMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_CHECKED);//ID法,需要去菜单栏拿取选项的ID并且参1改为命令宏,是对应使用的//2)让选项加粗(设置默认项),注意一个菜单栏只能有一个加粗,所以最后3将覆盖2加粗submenu->SetDefaultItem(2, TRUE);submenu->SetDefaultItem(3, TRUE);//3) 禁用选项,使选项变灰(注意分界线也算一个下标选项)CFrameWnd::m_bAutoMenuEnable = false;//这句一般放构造处理submenu->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED);//移除菜单栏SetMenu(NULL);//重新加载自己新建的菜单栏(需要自己去菜单栏操作,右击Menu文件夹插入Menu即可)CMenu menu2;menu2.LoadMenuW(IDR_MENU1);SetMenu(&menu2);menu2.Detach();//防止窗口创建后menu2被释放,再按选项return 0;
}

这是我自己自定义的菜单栏。

结果:

3 菜单栏的更新机制

菜单栏的选项类似Qt的绘图事件,都是会自动更新绘图,MFC的菜单栏也一样,每次按下某个选项后,都会自动更新菜单栏。因为菜单栏的更新机制是自动的,所以我们一般通过使用标志位来显示选项以达到自己的目的。例如下面案例,按下cc选项,使bb选项变亮。

继续上面的程序:
1)因为我们要使bb变亮,所以创建bb的UI处理程序。

2)又因为我们需要按下cc控制bb的亮度,所以需要添加消息的COMMAND回调函数。

3)添加成员变量标志位bool类型。

4)编写代码。

//bb的自动更新回调
void CMainFrame::OnUpdateBbBb(CCmdUI *pCmdUI)
{// TODO: 在此添加命令更新用户界面处理程序代码//自动回调更新,不需要手动调用if (m_cc == true) {pCmdUI->Enable(TRUE);}else {pCmdUI->Enable(FALSE);}
}//cc的按钮按下回调
void CMainFrame::OnBbCc()
{// TODO: 在此添加命令处理程序代码//按下cc键m_cc = !m_cc;//即m_cc = TRUE;
}

结果就是按下cc后,bb的亮度改变,不截图了。

4 左键弹出菜单栏快捷键

由于是鼠标按下事件,所以我们将函数放在视图中处理,放在框架会导致没反应。注意一下菜单栏的选项放在框架处理,选项的按下放在视图处理。

void CMenuView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//重新创建菜单栏,不要使用Get获取框架类的对象//CMenu *m = GetMenu();//在视图而非框架类中时,禁用CMenu menu;menu.LoadMenuW(IDR_MENU1);CMenu *submenu = menu.GetSubMenu(0);ClientToScreen(&point);//将相对于屏幕的坐标换成相对于窗口的坐标//按下左键,弹出子菜单栏,即左键就是该子菜单栏的快捷键submenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this);CView::OnLButtonDown(nFlags, point);
}

结果,按下左键就相当于按下了bb子菜单栏。

MFC之菜单栏的相关使用14相关推荐

  1. MFC中使用FLASH相关

    2019独角兽企业重金招聘Python工程师标准>>> 一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/ ...

  2. 计算机制图的相关标准,14 计算机制图规则 - 房屋建筑制图统一标准 GB/T50001-2010 - 消防规范大全 - 消防资源网!...

    14.0.1 计算机制图的方向与指北针应符合下列规定: 1 平面图与总平面图的方向宜保持一致: 2 绘制正交平面图时,宜使定位轴线与图框边线平行(图14.0.1-1): 3 绘制由几个局部正交区域组成 ...

  3. 《基于MFC的OpenGL编程》Part 14 Quadrics

    本文在第11篇文章的基础上,为其加入显示各种二次曲面的代码: Quadrics Every quadric has a few settings associated with it. We have ...

  4. MFC Slider Controll的相关用法

    滑动控件是Windows中最常用的控件之一.一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值.通常,在滑动控件附近一定有标签控件或编辑框控件,用于显示 ...

  5. 相关-5/14. 向量对向量求导/矩阵对矩阵求导

    文章目录

  6. MFC中设备描述表dc的使用

    1 以下代码我是在View类中实现的: 2 /** 利用平台SDK实现画线功能 3 // 首先获得窗口的设备描述表 4 HDC hdc; 5 hdc = ::GetDC( m_hWnd ); //调用 ...

  7. 从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向)学习课程

    从C++起步到MFC实战VC++软件工程师高端培训(服务器端开发方向)学习课程 主要内容: 本部分是您成为VC++软件工程师必备的阶段,如果您没有任何基础,学习C++能快速让您进入编程领域,建议配合书 ...

  8. VS2008 MFC类库精讲:使用MFC V9.0类库及新版Office Fluent UI实现CAD系统

    学习地址:http://***/goods.php?id=164 内容简介:    本培训视频主要通过带领学员实现一个CAD系统(TinyCAD),从而学习和掌握在VS2008 IDE环境中MFC的基 ...

  9. 190326 逆向-MFC逆向技巧

    MFC 简介 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows ...

  10. MFC常识性知识汇总

    目录 1.BitMap与Dc间的关系. 2.由位图bitmap对象到位图文件保存. 3.OnOK().OnCancel().OnClose().OnDestroy() 对话框概念. 4.OnDrow和 ...

最新文章

  1. 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...
  2. 关于Jsoup解析https网页的问题
  3. Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析
  4. source环境变量命令千万不能乱用
  5. [编程题]数字分类 (20)
  6. Android——GridLayout
  7. HH SaaS电商系统服务商品在移动端下单结算的交互设计
  8. JS基础_强制类型转换-Number
  9. 【机器学习-数据科学】第二节:ipython开发环境搭建以及pandas快速入门
  10. Leetcode--904. 水果成篮
  11. 计算机如何断开局域网,win7如何禁止局域网用户访问电脑
  12. iOS开发应用结构化资源储备
  13. POJ 3111 K Best 贪心 二分
  14. android 创建typeface 对象,java – 检查Android中的Typeface对象的族
  15. Eclipse使用Git上传新项目到GitHub
  16. 新路由3 newifi3 官方固件与离线插件合集
  17. 通用数据权限管理系统设计
  18. html5背景图片幻灯片切换,如何将一个PPT的背景设置成另一个PPT的背景?
  19. 【黑马Java笔记+踩坑】MyBatisPlus基础
  20. 电力拖动控制系统作业答案4

热门文章

  1. 文曲星猜数字游戏java代码_文曲星猜数字游戏6步算法(含代码)
  2. 深度强化学习(机器之心)
  3. C++ protected 解析
  4. git Pull Request 是什么意思?
  5. Do we need an operating system?
  6. linux命令获取reboot信息,linux的reboot命令
  7. dpdk 驱动移植叩开 kni 模块那些黑暗的角落
  8. E. Thematic Contests【dp】
  9. Between Us 3 人类的进化
  10. 固实压缩文件容易损坏_请慎重使用固实压缩文件