当前位置: 首页 > news >正文

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文档;向文档中写入字符串&#xff…...

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}指定指数代码,获取该指数的实时行情(开、高、低、收、量)。 更新周期:实时。 请求方式&#xff1a…...

Qt5开发实战_图形_QPen

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

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言:本节主要讲解内核也就是操作系统对于硬件的管理, 本节内容同样为进程的周边知识。 主要是关于软件方面, 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章, 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…...

同声传译语音合成接口,分段预合成实现丝滑的衔接效果

背景: 在使用微信官方语音合成插件的时候遇到一个问题,textToSpeech这个api的内容限制在官网的文档上明明是1000个字节,也就是说能保证333个中文字符应该是没有问题的,但是也不知道为什么我这里仅仅传了150个中文字符就报错了&…...

数据结构——单链表详解(超详细)(1)

前言: 小编在近日学习了单链表的知识,为了加强记忆,于是诞生了这一篇文章,单链表是数据结构比较重要的知识,读者朋友们一定要去好好的学习!这个可以说是比顺序表更好用的线性表,下面废话不多说&…...

在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息

lspci 命令用于显示 Linux 系统上的设备和驱动程序 当在个人电脑或服务器上运行 Linux 时,有时需要识别该系统中的硬件。lspci 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 pciutils 包提供,可用于各种基于 Linux 和…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...