【MFC】CMenu实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整
【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实现菜单栏/工具栏、工具栏前勾选效果、菜单文本动态调整相关推荐
- Vue3 - Element plus 实现 “带分页“ 表格组件,实现跨页进行 “分页勾选“ 的多选功能(解决分页表格组件 <el-table> 跨页后已前勾选的行自动消失问题)详细示例解决教程
前言 在 Vue3 项目中,使用 Element Plus 组件库的表格组件时,出现了跨页勾选复选框消失的问题. 本文实现了 vue3 中 element plus 表格组件 <el-table ...
- 帆软复选框根据数据库值显示勾选效果
1.经过测试,帆软8.0,sql编辑框里面展示"勾选复选框"字体图标无法正常展示,不展示或者展示问号 2.解决办法 步骤一.自定义字典前要修改fineReport的字符集 参考:h ...
- cocos creator 使用shader 不要勾选项目设置的动态图集和图片的自动合批
学习链接 https://forum.cocos.org/t/creator-shader-2019-10-22-2-2-0/82548 因为主要目的是为了避开cocos creator Mask的 ...
- 【MFC】工具栏按钮多选效果本
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 多选效果就是指工具栏按 ...
- layui 分页勾选。
话不多说直接上图,上代码 ui:layui 后台用的thinkphp5 不用安装啥,只要自己有layui的js,引入后提取你需要的部分. 主要部分:parseData返回数据处理.工具栏事件.单选事件 ...
- 复选框JCheckBox勾选改变内容
勾选前 勾选后 取消勾选–恢复原状 贴代码 JCheckBox chckbxNewCheckBox = new JCheckBox("勾选事件");chckbxNewCheckBo ...
- quasar树组件勾选策略改写
quasar树组件勾选策略改写 前言 一.页面 二.script部分 树数据结构 前言 quasar的树组件的勾选策略在有些时候不太适用,leaf 策略会影响父级的勾选状态,但是无法通过组件提供的ap ...
- jQuery 表单提交衣服尺寸选择勾选获取value值-20130720
1.效果及功能说明 表单提交制作各大商城衣服尺寸选择勾选效果,点击购物车提交勾选尺寸value值.一款简单实用的衣服尺寸选择勾选效果 2.实现原理 通过查询当前的图片的id然后通过对应id找到在通过遍 ...
- 网页页面中的几种勾选的效果制作,勾选框
页面中的勾选框还是比较常见的啊,一般都是请勾选 同意什么协议什么 七天登录什么的 但是我们要自己制作一个呢 先看下下面的几种效果 上面用了四个方法 做出来的勾选情况 接下来进行一一讲解 1.最常见的 ...
最新文章
- wowpve服务器优势,PVE服务器法师对本职业的一点看法
- 【转载】locust性能测试3
- 最新发布丨金融新基建系列报告:银行业六大中期趋势展望
- ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法
- 如何把安全证书导入到java中的cacerts证书库(转)
- Android之靠谱的把图片和视频插入手机系统相册
- java注解 sql_mybatis中注解映射SQL示例代码
- 11input/output
- redis——数据库
- php ajax 加载列表,Ajax点击不断加载数据列表(图文教程)
- derby mysql 同步_[Derby]数据库操作说明
- ORACLE中date类型字段的处理
- 对variable-sized object may not be initialized的一点理解
- 【目标检测】(12) 非极大值抑制 NMS 和 Soft-NMS,附TensorFlow完整代码
- java cmyk和rgb的转换_CMYK和RGB怎么转换
- 样本不平衡的解决方案(很详细)
- FFMPEG 常用命令一览
- html网页设计小作业(个人主页)
- 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)
- BlackHat2017热点之数据取证与事件响应