MFC之菜单栏的相关使用14

2023-11-05

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子菜单栏。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC之菜单栏的相关使用14 的相关文章

  • 利用mybatis框架的解析器实现文本动态参数

    问题 脚本模板完成后 有些不同的主机执行同一个脚本模板时需要的参数不一样 那么在不同的主机上执行同个脚本时怎么动态将参数赋值给待执行的脚本 而不用直接修改脚本内容 解决方案 Mybatis框架本身的解析器GenericTokenParser
  • Springboot整合Zipkin+kafka+ELK,实现链路追踪和日志收集

    背景 随着项目的深入 久不久可能出现些问题 但是查询起来又极其麻烦 线上有三台服务器 不知道报错日志在那台上 很麻烦 所以领导要求把项目的链路追踪和日志给统一输出到elk中 可以实现在elk查询 Zipkin Sleuth链路追踪 先来实现
  • 宠物行业如何进行软文营销

    如今 宠物已经成为了人们生活中不可或缺的一部分 大众对于萌宠的喜爱与日俱增 随着 萌宠经济 升温 越来越多的商机开始出现 伴随着宠物市场竞争的日益激烈 宠物行业的营销光靠硬广告很难吸引受众 现在的大趋势应该是软文营销为主 那么宠物行业应该如
  • Neural Network Intelligence (NNI)

    环境 conda install pytorch 1 7 0 torchvision 0 8 0 torchaudio 0 7 0 cudatoolkit 10 1 c pytorch 每次看起来都很简单 自己写起来才知道哪里不会 impo
  • 【整合】【故障排查】LINUX系统资源使用情况排查(top、htop、ps、pstree)

    LINUX系统资源使用情况排查 工作中我们常见的资源使用情况的排查包括 CPU使用情况 内存使用情况 网络带宽使用情况等等 而我们常用的工具有top htop ps pstree等等 htop top加强版 pstree ps加强版 ps与
  • spark sql 创建rdd以及DataFrame和DataSet互转

    spark sql 创建rdd以及DataFrame和DataSet互转 使用SparkSession读取本地文件创建rdd DateSet的介绍 DataFrame的介绍 Rdd转DateFrame 读取本地文件得到DataFrame D
  • 剑指offer面试题62(java版):圆圈中最后剩下的数字

    welcome to my blog 剑指offer面试题62 java版 圆圈中最后剩下的数字 题目描述 每年六一儿童节 牛客都会准备一些小礼物去看望孤儿院的小朋友 今年亦是如此 HF作为牛客的资深元老 自然也准备了一些小游戏 其中 有个
  • latex加空行,加分割线,注释,设置表格字体大小等操作

    1 在文字末尾加空行可以用 2 直接加空行可以用 3 分割线 hrule 4 Latex编辑器Texstudio的注释快捷键 注释 Ctrl T 取消注释 Ctrl U 5 设置表格字体大小 Latex字体大小设置代码 begin tabl
  • MobaXterm连接服务器(虚拟机)

    下载链接 MobaXterm 终端工具 下载 安装 使用教程 蜗牛也不慢 的博客 CSDN博客 这个讲的很详细了 注意虚拟机的IP获取

随机推荐

  • 关于UNITY中System.Drawing引用失败的处理方法

    关于UNITY中System Drawing引用失败的处理方法 今天在使用EPPlus中 遇到一个处于This type has been forwarded to assembly System Drawing Version 4 0 0
  • 解决pip下载pytorch因网速慢而失败的问题

    一 一般下载pytorch方法 1 首先打开浏览器 输入 pytorch 然后进行搜索 点击pytorch的官网就进入了 2 进入到pytorch的官网后 划叶到下面 找到下面的选择框 根据自己的配置 选择正确的版本号 选择完后 把红色框内
  • 完美立方(C语言)

    题目 形如 a 3 b 3 c 3 d 3a 3 b 3 c 3 d 3 的等式被称为完美立方等式 例如 12 3 6 3 8 3 10 312 3 6 3 8 3 10 3 编写一个程序 对任给的正整数 N N le 100 N N 10
  • C# AES加密算法

    using System using System Collections Generic using System IO using System Linq using System Security Cryptography using
  • Gradle 团队发布了Gradle 7.2

    Gradle 团队近日发布 Gradle 7 2 Gradle 是一个类似于 Maven 项目的自动化构建工具 支持依赖管理和多项目 Gradle 抛弃了 Maven 基于 XML 的繁琐配置 取而代之的是Gradle 采用了特定语言 Gr
  • python实现堆栈和队列

    1 python实现堆栈 可先将Stack类写入文件stack py 在其它程序文件中使用from stack import Stack 然后就可以使用堆栈了 stack py的程序如下 class Stack def init self
  • linux下通过mount挂载iscsi、ntfs、nfs详解

    通常服务器本机自带磁盘空间有限 都需要额外加载磁盘 可以采用mount方式把远程的共享存储磁盘加载进来 目前用过的有iscsi ntfs nfs三种类型 一 mount挂载iscsi类型1 查找下准备挂载的磁盘或者存储器 root loca
  • SSL P2415 连通块

    2008 南海初中竞赛 连通块 Time Limit 10000MS Memory Limit 65536K Total Submit 41 Accepted 19 Case Time Limit 1000MS
  • Ubuntu使用vim报错 “/user/lib/python3.10/site.py“ E212: Can‘t open file for writing

    这个错误是由于没有足够的权限导致的 尝试使用sudo命令来重启编辑器或者直接打开终端并使用sudo命令编辑文件 需要重新打开命令行 但是现在是ssh 可能是用root权限进入vim后权限过期 折磨我十分钟 在网上搜了很多方法也没有解决 最后
  • 第13节-PhotoShop基础课程-裁剪工具

    文章目录 前言 1 裁剪工具 1 基本操作 Alt Shift 2 拉直 3 内容识别 自动填充 2 透视裁剪工具 3 切片工具 长图分成多个 4 切片选择工具 5 存储为一张一张 前言 1 裁剪工具 1 基本操作 Alt Shift 2
  • openwrt 查看运行程序_Go 语言交叉编译在 openwrt 上运行的程序

    go 语言一个很好的地方是可以方便的进行交叉编译 也就是编译出在不同于当前硬件平台 操作系统 上运行的程序 今天尝试编译一段代码到小米路由器 3G 上运行 具体过程记录在下面 供大家参考 环境 编译环境 mac go 1 11 运行环境 路
  • 逻辑回归:逻辑回归中的参数

    转载自 https blog csdn net Captain DUDU article details 105081643 LogisticRegression 一共有14个参数 逻辑回归参数详细说明 参数说明如下 penalty 惩罚项
  • hadoop高可用集群启动yarn失败

    hadoop高可用集群启动yarn失败 通过查看日志信息发现主要错误如下 org apache zookeeper ClientCnxn Session 0x0 for server null unexpected error closin
  • WindowsError:[Error ] 全系列

    ERROR FILE NOT FOUND 指定的文件不存在 ERROR INVALID PARAMETER 参数错误 ERROR ACCESS DENIED 访问被拒绝 ERROR INVALID HANDLE 无效的句柄 ERROR NO
  • Kotlin基础

    Kotlin是什么 它是一种针对 java 平台的新编程语言 Kotlin 简洁 安全 务实 Kotlin可以运行在 任何 java 运行的地方 并且能够和 java语言无缝对接上 kotlin语言和java语言一样 都是静态语言 java
  • PCB设计时对于EMC有哪些需要注意的?

    详细如下 EMC的PCB设计技术 分层 布局 布线 pcb的emc设计 Me sl 的博客 CSDN博客 PCB EMC 设计的关键 是尽可能减小回流面积 让回流路径按照设计的方向流动 最常见返回电流问题来自于参考平面的裂缝 变换参考平面层
  • MySQL数据库 【增删改查】

    目录 一 新增 指定列插入 一次插入多个数据 二 查询 1 全列查询 2 指定列查询 3 查询字段为表达式 4 查询的时候给列名 表达式 指定别名 5 查询时去重 6 排序查询 7 条件查询 8 模糊查询 9 空值查询 10 分页查询 三
  • JavaScript中的字符串替换

    今天一大早遇到个状况 json字符串中有些undefined数据 导致图表不能正常显示 本来打算用isNaN判断是否是数字 后来感觉操作起来有些麻烦 就打算用 null 把 undefined 全部替换到 于是用replace函数进行替换
  • 菜鸟的我运行了hello word 在华为鸿蒙2.0beta

    相信自从华为上次华为鸿蒙发布会之后 不少尝鲜用户都已经使用华为鸿蒙的IDE开发程序 那么网上的教程也很多 这里我通过华为鸿蒙官方教程成功安装并且成功运行hello word 我还是菜鸟 大佬勿喷 鸿蒙源码 https openharmony
  • MFC之菜单栏的相关使用14

    1 菜单栏选项的打勾 加粗 禁用 首先我们需要知道菜单栏包含子菜单栏 依次使用下标去区分 然后拿到子菜单栏后 就可以操作里面的选项了 可以通过下标 选项的ID 在资源视图的菜单栏的图 点击选项右击属性即可获取 进行操作 代码 由于为了减少视