【MFC】CMenu实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整

  • 说明
  • 菜单栏/工具栏的创建
  • 添加菜单栏/工具栏
  • 工具栏前勾选效果
  • 菜单文本动态调整
  • 其他

说明

主要介绍该如何加载菜单栏、工具栏,如何改变菜单栏的文字,如何实现菜单栏Checked的勾选效果。

菜单栏/工具栏的创建

“资源视图”内选择“添加资源”,再在弹出的对话框中选择“Menu”再“新建”,菜单栏创建完毕。
之后就可以根据自己的需求,是要建立菜单栏还是工具栏。

往下创建设置为菜单栏,往右延伸为工具栏。

添加菜单栏/工具栏

作为菜单栏:
在鼠标点击的位置创建菜单栏

void CMenuTestDlg::OnRButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CMenu             Menu;CMenu              *pSubMenu;CPoint                p;//建立复制菜单GetCursorPos(&p);Menu.LoadMenu(IDR_MENU1);pSubMenu = Menu.GetSubMenu(0);pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this);Menu.Detach();Menu.DestroyMenu();CDialogEx::OnRButtonUp(nFlags, point);
}

作为工具栏:
代码实现的方式是类似的,只要在OnInitDialog()函数内初始化即可。
除了代码实现以外,还可通过配置选项简单实现。
只需要在“属性”内添加你创建好的工具栏即可,通过这种方法有个优点:不会影响对话框的Size,而通过代码添加的工具栏会影响到对话框的size。
假设一个对话框内可视区域的宽为200,工具栏宽度为10。通过代码添加,会导致工具栏是在可视区域内被创建,200的像素有10像素已经被工具栏占用;通过属性栏添加,工具栏是在可视区域以外加入工具栏,不会占用对话框本身的200像素。这种情况在OnSize()函数内影响较大。

工具栏前勾选效果

效果图:

代码实现:
方法一:

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:Menu菜单栏勾选框设置
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuCheckSet(UINT MenuID, bool bCheck)
{if (bCheck){//MF_BYCOMMAND GetMenu()->CheckMenuItem(MenuID, MF_BYCOMMAND | MF_CHECKED);}else{GetMenu()->CheckMenuItem(MenuID, MF_BYCOMMAND | MF_UNCHECKED);}
}//创建对应的菜单选项响应函数
void CMenuTestDlg::OnOptionTest()
{static bool bStatus;bStatus = !bStatus;// TODO: 在此添加命令处理程序代码MenuCheckSet(ID_OPTION_TEST, bStatus);
}

方法二:
根据菜单选项的位置来实现勾选效果

void CMenuTestDlg::OnOptionTest()
{CMenu*             pMenu;static bool           bStatus = false;bStatus = !bStatus;//“测试项”菜单在工具栏的第二个位置(从0算起则为1)//定位到“测试项”所在菜单的第几列pMenu = GetMenu()->GetSubMenu(1);if (bStatus){//0表示“测试项”位于“工具”的第一个选项(从0算起)//MF_BYPOSITION pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);}else{pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_UNCHECKED);}
}

菜单文本动态调整

关键函数为ModifyMenu()

void CMenuTestDlg::OnOptionTest()
{CMenu*             pMenu;CString               str;static bool         bStatus = false;bStatus = !bStatus;//“测试项”菜单在工具栏的第二个位置(从0算起则为1)//定位到“测试项”所在菜单的第几列pMenu = GetMenu()->GetSubMenu(1);if (bStatus){str.Format(_T("选中"));//pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);}else{str.Format(_T("未选中"));//pMenu->CheckMenuItem(0, MF_BYPOSITION | MF_UNCHECKED);}//改变选项文本pMenu->ModifyMenu(0, MF_BYPOSITION | MF_STRING, ID_OPTION_TEST, str);}

其他

这边再分享两个自己写的使能和禁用菜单栏的函数。

//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:使能 Menu菜单栏
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuOptionEnable(UINT MenuID)
{GetMenu()->EnableMenuItem(MenuID, MF_BYCOMMAND | MF_ENABLED );//使能可被选择
}
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
//描述:禁用 Menu菜单栏
//参数:
//□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□//
void CMenuTestDlg::MenuOptionDisable(UINT MenuID)
{GetMenu()->EnableMenuItem(MenuID, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);//不能被选择且变灰
}

【MFC】CMenu实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整相关推荐

  1. Vue3 - Element plus 实现 “带分页“ 表格组件,实现跨页进行 “分页勾选“ 的多选功能(解决分页表格组件 <el-table> 跨页后已前勾选的行自动消失问题)详细示例解决教程

    前言 在 Vue3 项目中,使用 Element Plus 组件库的表格组件时,出现了跨页勾选复选框消失的问题. 本文实现了 vue3 中 element plus 表格组件 <el-table ...

  2. 帆软复选框根据数据库值显示勾选效果

    1.经过测试,帆软8.0,sql编辑框里面展示"勾选复选框"字体图标无法正常展示,不展示或者展示问号 2.解决办法 步骤一.自定义字典前要修改fineReport的字符集 参考:h ...

  3. cocos creator 使用shader 不要勾选项目设置的动态图集和图片的自动合批

    学习链接  https://forum.cocos.org/t/creator-shader-2019-10-22-2-2-0/82548 因为主要目的是为了避开cocos creator Mask的 ...

  4. 【MFC】工具栏按钮多选效果本

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 多选效果就是指工具栏按 ...

  5. layui 分页勾选。

    话不多说直接上图,上代码 ui:layui 后台用的thinkphp5 不用安装啥,只要自己有layui的js,引入后提取你需要的部分. 主要部分:parseData返回数据处理.工具栏事件.单选事件 ...

  6. 复选框JCheckBox勾选改变内容

    勾选前 勾选后 取消勾选–恢复原状 贴代码 JCheckBox chckbxNewCheckBox = new JCheckBox("勾选事件");chckbxNewCheckBo ...

  7. quasar树组件勾选策略改写

    quasar树组件勾选策略改写 前言 一.页面 二.script部分 树数据结构 前言 quasar的树组件的勾选策略在有些时候不太适用,leaf 策略会影响父级的勾选状态,但是无法通过组件提供的ap ...

  8. jQuery 表单提交衣服尺寸选择勾选获取value值-20130720

    1.效果及功能说明 表单提交制作各大商城衣服尺寸选择勾选效果,点击购物车提交勾选尺寸value值.一款简单实用的衣服尺寸选择勾选效果 2.实现原理 通过查询当前的图片的id然后通过对应id找到在通过遍 ...

  9. 网页页面中的几种勾选的效果制作,勾选框

    页面中的勾选框还是比较常见的啊,一般都是请勾选 同意什么协议什么 七天登录什么的 但是我们要自己制作一个呢 先看下下面的几种效果 上面用了四个方法 做出来的勾选情况 接下来进行一一讲解 1.最常见的 ...

最新文章

  1. wowpve服务器优势,PVE服务器法师对本职业的一点看法
  2. 【转载】locust性能测试3
  3. 最新发布丨金融新基建系列报告:银行业六大中期趋势展望
  4. ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法
  5. 如何把安全证书导入到java中的cacerts证书库(转)
  6. Android之靠谱的把图片和视频插入手机系统相册
  7. java注解 sql_mybatis中注解映射SQL示例代码
  8. 11input/output
  9. redis——数据库
  10. php ajax 加载列表,Ajax点击不断加载数据列表(图文教程)
  11. derby mysql 同步_[Derby]数据库操作说明
  12. ORACLE中date类型字段的处理
  13. 对variable-sized object may not be initialized的一点理解
  14. 【目标检测】(12) 非极大值抑制 NMS 和 Soft-NMS,附TensorFlow完整代码
  15. java cmyk和rgb的转换_CMYK和RGB怎么转换
  16. 样本不平衡的解决方案(很详细)
  17. FFMPEG 常用命令一览
  18. html网页设计小作业(个人主页)
  19. 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)
  20. BlackHat2017热点之数据取证与事件响应

热门文章

  1. 作品1:MIDI彩虹钢琴(修改midi文件的音色)
  2. HashMap源码(jdk1.7)
  3. 最全从零配置Fiddler实现抓取app数据(HTTPHTTPS)
  4. Linux手机设备不能识别的解决
  5. 王冠逸亮相日内瓦表展 海兰察与金刚狼打破次元壁get同框
  6. WPF(C#) 打印各类型文件
  7. 从转转APP获取搜索数据。
  8. ai人工智能的本质和未来_是人工智能手中网络安全的未来AI 3
  9. 聊聊H5与JS近几年的黑科技
  10. Vue中使用echarts定制特殊的仪表盘