MFC Ribbon菜单 - 中英文实时切换方法
简介
最近在搞一个老外的项目,本来谈的好好的,纯英文界面。项目接近尾声了,又提出了中英文实时切换的新需求,没办法就只能想办法,毕竟客户最大嘛。
实现方法
还好本来的ribbon英文菜单不复杂,就用纯C++编码的方式实现了中英文切换。方法如下:
1)添加一个ribbon分类,取名为"Language"
2) 在"Language"分类里添加一个Panel, 在Panel里添加一个Button, Button的名称为"Chinese"。
3) 为"Chinese"按钮添加消息响应函数。
4) 接下来就是在响应函数里编写切换的内容了。
Ribbon资源图
Chinese按钮属性
添加消息响应函数
编程实现中英文切换
void CMainFrame::OnLanguage()
{//新添加的"Languae"在第5个分类栏,所以GetCategory(5)//Panel就一个,所以GetPanel(0)//按钮就一个,所以GetElement(0)//获取按钮上的文本,判断是"Chinese"还是“中文”CString str = m_wndRibbonBar.GetCategory(5)->GetPanel(0)->GetElement(0)->GetText();if (str == "Chinese") {if (IsValidCodePage(2052)) {MessageBox("The language Chinese Simplified PRC is not supported in this system.");return;}theApp.m_Lang = 2052;m_wndRibbonBar.GetCategory(0)->SetName("中文分类0");m_wndRibbonBar.GetCategory(0)->GetPanel(0)->GetElement(0)->SetText("按钮001");m_wndRibbonBar.GetCategory(1)->SetName("中文分类1");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(0)->SetText("按钮111");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(2)->SetText("按钮112");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(4)->SetText("按钮113");m_wndRibbonBar.GetCategory(1)->GetPanel(1)->GetElement(0)->SetText("按钮121");m_wndRibbonBar.GetCategory(1)->GetPanel(2)->GetElement(0)->SetText("检查框131");m_wndRibbonBar.GetCategory(1)->GetPanel(2)->GetElement(2)->SetText("检查框132");m_wndRibbonBar.GetCategory(2)->SetName("中文分类2");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(0)->SetText("按钮211");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(2)->SetText("按钮212");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(4)->SetText("按钮213");m_wndRibbonBar.GetCategory(3)->SetName("中文分类3");m_wndRibbonBar.GetCategory(3)->GetPanel(0)->GetElement(0)->SetText("按钮311");m_wndRibbonBar.GetCategory(3)->GetPanel(0)->GetElement(2)->SetText("按钮312");m_wndRibbonBar.GetCategory(4)->SetName("中文分类4");m_wndRibbonBar.GetCategory(4)->GetPanel(0)->GetElement(0)->SetText("按钮411");m_wndRibbonBar.GetCategory(5)->SetName("语言");m_wndRibbonBar.GetCategory(5)->GetPanel(0)->GetElement(0)->SetText("英文");}else {if (IsValidCodePage(1033)) {MessageBox("英文启动不支持,系统不能识别英文.");return;}theApp.m_Lang = 1033;m_wndRibbonBar.GetCategory(0)->SetName("Category0");m_wndRibbonBar.GetCategory(0)->GetPanel(0)->GetElement(0)->SetText("Button001");m_wndRibbonBar.GetCategory(1)->SetName("Category1");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(0)->SetText("Button111");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(2)->SetText("Button112");m_wndRibbonBar.GetCategory(1)->GetPanel(0)->GetElement(4)->SetText("Button113");m_wndRibbonBar.GetCategory(1)->GetPanel(1)->GetElement(0)->SetText("Button121");m_wndRibbonBar.GetCategory(1)->GetPanel(2)->GetElement(0)->SetText("Checkbox131");m_wndRibbonBar.GetCategory(1)->GetPanel(2)->GetElement(2)->SetText("Checkbox132");m_wndRibbonBar.GetCategory(2)->SetName("Category2");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(0)->SetText("Button211");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(2)->SetText("Button212");m_wndRibbonBar.GetCategory(2)->GetPanel(0)->GetElement(4)->SetText("Button213");m_wndRibbonBar.GetCategory(3)->SetName("Category3");m_wndRibbonBar.GetCategory(3)->GetPanel(0)->GetElement(0)->SetText("Button311");m_wndRibbonBar.GetCategory(3)->GetPanel(0)->GetElement(2)->SetText("Button312");m_wndRibbonBar.GetCategory(4)->SetName("Category4");m_wndRibbonBar.GetCategory(4)->GetPanel(0)->GetElement(0)->SetText("Button411");m_wndRibbonBar.GetCategory(5)->SetName("Language");m_wndRibbonBar.GetCategory(5)->GetPanel(0)->GetElement(0)->SetText("Chinese");}//这两行一定要加,否则ribbon不会重新计算位置和重画。m_wndRibbonBar.ForceRecalcLayout();m_wndRibbonBar.RedrawWindow();
}
注意事项
在上面的代码中,可以看到有写panel里面获取element时,并不是0,1,2那样紧挨着获取的Element,而是0,2,4这样获取的Element。
那是因为Panel里面除了按钮之外,还有Seperator,就是分割线,他们是一种没有文本的分割线。所以要跳过分割线。
小结
这种通过硬编码的方式修改Ribbon界面的方式比较笨,但是好在确实十分有效。目前我的项目已经在客户那里验证通过了,也算没白费。
相关文章:

MFC Ribbon菜单 - 中英文实时切换方法
简介 最近在搞一个老外的项目,本来谈的好好的,纯英文界面。项目接近尾声了,又提出了中英文实时切换的新需求,没办法就只能想办法,毕竟客户最大嘛。 实现方法 还好本来的ribbon英文菜单不复杂,就用纯C编码…...

MFC程序创建word,创建表格,写入数据
文章目录 1、MFC程序功能:2、MFC程序实现2.1 创建项目2.2 添加word操作类2.3 添加word资源2.4 编写代码,实现将数据写入到word2.5 运行程序、验证功能3、工程代码下载 1、MFC程序功能: 创建word文档;向文档中写入字符串ÿ…...

FPGA:基于复旦微FMQL10S400 /FMQL20S400 国产化核心板
复旦微电子是国内集成电路设计行业的领军企业之一,早在2000年就在香港创业板上市,成为行业内首家上市公司。公司的RFID芯片、智能卡芯片、EEPROM、智能电表MCU等多种产品在市场上的占有率位居行业前列。 今天介绍的是搭载复旦微 FMQL10S400/FMQL20S400的…...

centos下使用yum安装keepalived工具
1、安装如下rpm包,不安装此包在装keepalived时会报错 mkdir keepalived_rpm cd keepalived_rpm/ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-community-libs-compat-8.0.36-1.el7.x86_64.rpm 2、使用yum进行keepalived的安装 yum -y install keepal…...

无人机图像目标检测
本仓库是人工智能课程的课程作业仓库,主要是完成无人机图像目标检测的任务,我们对visdrone数据集进行了处理,在yolo和ssd两种框架下进行了训练和测试,并编写demo用于实时的无人机图像目标检测。 requirements依赖: ss…...
JSqlParser 解析 sql
目录 前言一、Maven依赖二、获取sql中的表名三、获取sql中的具体信息 前言 JSqlParser是一个 SQL 语句解析器。它将 SQL 语句转换为可遍历的 Java 类层次结构,可以方便的用代码对 SQL 语句进行解析,修改等操作。 官网 api 文档和 github 地址如下&…...

Vue中使用mind-map实现在线思维导图
概述 在前面的文章Vue中实现在线画流程图实现中介绍了流程图的在线绘制,在本文,给大家分享一下基于mind-map实现在线的思维导图,并实现:1. 导图导出为图片;2. 打开xmind文件。 实现效果 实现 1. mind-map简介 simp…...

ChatGPT 深度解析:技术驱动的智能对话
在当今科技飞速发展的时代,ChatGPT 无疑成为了最耀眼的明星之一。它以其令人惊叹的智能对话能力,引发了全球范围内的广泛关注和热议。 ChatGPT 背后的技术堪称精妙绝伦。它基于深度学习算法,通过对海量数据的学习和分析,从而能够理…...

Armv8-R内存模型详解
目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好,今天是悲伤的肌肉。 在调研区域控制器芯片时,发现了S32Z、Stellar …...
Python面经
文章目录 Python基本概念1. Python是**解释型**语言还是**编译型**语言2. Python是**面向对象**语言还是面向过程语言3. Python基本数据类型4.append和 extend区别5.del、pop和remove区别6. sort和sorted区别介绍一下Python 中的字符串编码is 和 的区别*arg 和**kwarg作用浅拷…...

海外ASO:iOS与谷歌优化的相同点和区别
海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程,两个不同的平台需要采取不同的优化策略,以下是对iOS优化和谷歌优化的详细解析: 一、iOS优化(App Store) 1、关键词覆盖 选择关…...

【C++题解】1168. 歌唱比赛评分
问题:1168. 歌唱比赛评分 类型:数组找数 题目描述: 四(1) 班要举行一次歌唱比赛,以选拔更好的苗子参加校的歌唱比赛。评分办法如下:设 N 个评委,打 N 个分数( 0≤每个分…...
鸿蒙开发工程师面试-架构篇
1. 假如让你负责鸿蒙App架构设计,你会关注哪些方面? 分层架构设计: 将应用划分为产品定制层、基础特性层和公共能力层,以降低层间依赖性,提升代码可维护性。通过分层架构设计,进一步明确每层的职责和层间交…...

【Redis】持久化
对于Redis中间件来说,一般是作为内存型数据库或者缓存出现的。但是由于其数据是在内存中,因此当Redis所在的主机宕机之后,数据就会消失,再次重启之后,没有任何数据。这对于生产环境来说,是属于P0级别的灾难…...

港股指数实时行情API接口
港股 指数 实时 行情 API接口 # Restful API https://tsanghi.com/api/fin/index/HKG/realtime?token{token}&ticker{ticker}指定指数代码,获取该指数的实时行情(开、高、低、收、量)。 更新周期:实时。 请求方式:…...

Qt5开发实战_图形_QPen
Qpen是Qt框架中的一个类,用于定义绘制线条的属性,包括颜色、宽度、样式、端点样式和连接样式。 具体属性(设置颜色和设置宽度直接pass从样式开始): 设置样式: pen的样式主要有以下几种: 分别是:直线样式…...

linux进程周边知识——内核对硬件的管理——计算机世界的管理
前言:本节主要讲解内核也就是操作系统对于硬件的管理, 本节内容同样为进程的周边知识。 主要是关于软件方面, 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章, 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…...
同声传译语音合成接口,分段预合成实现丝滑的衔接效果
背景: 在使用微信官方语音合成插件的时候遇到一个问题,textToSpeech这个api的内容限制在官网的文档上明明是1000个字节,也就是说能保证333个中文字符应该是没有问题的,但是也不知道为什么我这里仅仅传了150个中文字符就报错了&…...

数据结构——单链表详解(超详细)(1)
前言: 小编在近日学习了单链表的知识,为了加强记忆,于是诞生了这一篇文章,单链表是数据结构比较重要的知识,读者朋友们一定要去好好的学习!这个可以说是比顺序表更好用的线性表,下面废话不多说&…...
在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息
lspci 命令用于显示 Linux 系统上的设备和驱动程序 当在个人电脑或服务器上运行 Linux 时,有时需要识别该系统中的硬件。lspci 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 pciutils 包提供,可用于各种基于 Linux 和…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...