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界面的方式比较笨,但是好在确实十分有效。目前我的项目已经在客户那里验证通过了,也算没白费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌插件之一键关闭同域名页面

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 谷歌插件之一键关闭同域名页面 前言项目结构mainfest.jsonbackgroud.js 项目实现效果展示展望 前…

【手把手教你使用cgroup配置,十分钟就会】

手把手教你使用cgroup配置,十分钟就会 什么是cgroupcgroup中的参数概念及原理 以 memory为例看下如何配置配置内存限制写一个内存申请脚本执行脚本测试结束语 什么是cgroup cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制&#xff0c…

论文降痕降重全攻略:从技巧到工具,助你轻松应对学术挑战

AIGC降重工具:快速降低论文查重率 高查重率是许多毕业生的困扰。通常,高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法,如修改文本和增添原创内容,虽必要但耗时且成效不一。 鉴于此,应用AI工具进…

未来互联网的新篇章:深度解析Web3技术

随着技术的不断演进,Web3正逐渐成为引领未来互联网发展的关键驱动力。本文将深入探讨Web3技术的核心概念、关键特征以及其对未来互联网生态的深远影响,旨在帮助读者全面理解和把握这一新兴技术的发展方向和潜力。 1. Web3的基本概念和演进 Web3并非简单…

WindChill软件许可优化解决方案

WindChill软件介绍 WindChill作为PLM系统, 提供了帮助制造商在产品生命周期的各个阶段管理自己的产品的完整功能,其功能强大、高性能的体系结构正是为当今的全球环境而设计的,帮助公司提高生产效率并改善产品质量和性能。 WindChill许可问题…

每日一练 - 理解IGMP组播组信息

下面是路由器 RTB 的部分输出信息, 关于输出信息描述错误的是A.接口上动态加入的组播组个数是 1 B.加入的组播组地址是 225.1.1.2 C.dsplay igmp group 命令用来查看 IGMP 组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组信息 D.最后发…

让你的终端出现花哨明了的打印

本文代码使用较为简单&#xff0c;主要就是为了高亮打印&#xff0c;直接用即可 代码如下&#xff1a; /*** file cout.h* author BigDavid* brief * version 0.1* date 2024-07-10* * copyright Copyright (c) 2024* */ #pragma once #include<stdio.h>#include<uni…

自学鸿蒙HarmonyOS的ArkTS语言<六>警告弹窗AlertDialog和列表选择弹窗ActionSheet

一、警告弹窗 ... Button(点击我可以获取一个警告弹窗).onClick(() > {AlertDialog.show({title: 我是弹窗标题,subtitle: 我是副标题,message: 我是弹窗内容,autoCancel: true, // 点击遮罩层是否关闭alignment: DialogAlignment.Center, // 弹窗位置offset: { dx: 0, dy:…

手机通讯录大营救,恢复sim卡联系人的3个重要方法

在数字化世界的浩瀚海洋中&#xff0c;手机通讯录就像一艘承载着人际关系的生命之船。然而&#xff0c;当这艘船遭遇风浪&#xff0c;即sim卡上的联系人信息意外丢失时&#xff0c;我们该如何进行一场惊心动魄的大营救&#xff0c;找回那些珍贵的联系人呢&#xff1f;别担心&am…

springboot服装购物商城系统-计算机毕业设计源码35058

摘要 服装购物商城系统小程序&#xff0c;依托Spring Boot框架的强大支持&#xff0c;为用户呈现了一个功能丰富、体验流畅的在线购物平台。该系统不仅涵盖了商品展示、用户注册登录、购物车管理、订单处理、支付集成等核心购物流程&#xff0c;还引入了个性化推荐算法&#xf…

排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)

欢迎来到繁星的CSDN&#xff0c;本期的内容主要包括冒泡排序(BubbleSort&#xff09;&#xff0c;直接插入排序(InsertSort)&#xff0c;以及插入排序进阶版希尔排序&#xff08;ShellSort&#xff09;。 废话不多说&#xff0c;直接上正题&#xff01; 一、冒泡排序 冒泡排序…

Lumos学习王佩丰Excel第四讲:排序与选择

一、排序 1、简单排序&#xff1a;不要选中一列排序&#xff0c;不然只是局部排序&#xff0c;其他数据都会发生错乱。 2、多条件排序 3、2003版本中超过3个排序条件时如何处理&#xff1a;从最后一个条件到第一个条件倒着按照要求依次排序。 4、按颜色排序 5、自定义排序次序…

探索Kotlin:从K1到K2

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 嘿&#xff0c;小伙伴们&#xff01;今天我们来聊聊Kotlin&#xff0c;这个在安卓开发圈里越来越火的编程语言。…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式V2版本

GRAM&#xff08;GRAM可能是一个新提出的模型或方法的缩写&#xff0c;这里我们根据上下文进行解释&#xff09;受到诸如TorchKAN和ChebyKAN等Kolmogorov-Arnold网络&#xff08;KAN&#xff09;替代方案的启发。GRAM引入了一种简化的KAN模型&#xff0c;但同时利用了Gram多项式…

paddla模型转gguf

在使用ollama配置本地模型时&#xff0c;只支持gguf格式的模型&#xff0c;所以我们首先需要把自己的模型转化为bin格式&#xff0c;本文为paddle&#xff0c;onnx&#xff0c;pytorch格式的模型提供说明&#xff0c;safetensors格式比较简单请参考官方文档&#xff0c;或其它教…

Docker存储目录问题,如何修改Docker默认存储位置?(Docker存储路径、Docker存储空间)etc/docker/daemon.json

文章目录 如何更改docker默认存储路径&#xff1f;版本1&#xff08;没测试&#xff09;版本2&#xff08;可行&#xff09;1. 停止 Docker 服务&#xff1a;2. 创建新的存储目录&#xff1a;3. 修改 Docker 配置文件&#xff1a;4. 移动现有的 Docker 数据&#xff1a;5. 重新…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多&#xff0c;需要分割创建环境的情况时有出现&#xff0c;在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

香港紧缺什么类型人才?如何通过香港优才计划去香港就业?

香港目前紧缺多种类型的人才&#xff0c;这些需求反映在不同行业和专业领域。以下是根据最新信息整理的紧缺人才概览&#xff1a; 资讯科技&#xff08;IT&#xff09;人才&#xff1a;香港在IT领域&#xff0c;尤其是人工智能、云计算、软件开发、数据分析、用户体验设计&…

基于4G、5G和卫星宽带的应急通信车载聚合路由器组网方案

应急指挥车、现场应急指挥系统作为整个应急指挥平台的主要组成部分&#xff0c;被广泛用于救灾抢险,安全保障等特殊场景&#xff0c;可通过应急指挥车或现场应急指挥系统与后方指挥中心间传输音视频信息&#xff0c;实现现场与指挥中心的实时通信&#xff0c;进行视频会议和远程…

通用代码生成器模板体系,域对象,枚举和动词算子

通用代码生成器模板体系&#xff0c;域对象&#xff0c;枚举和动词算子 通用代码生成器或者叫动词算子式通用目的代码生成器是一组使用Java编写的通用代码生成器。它们的原理基于动词算子和域对象的笛卡尔积。它们没有使用FreeMarker和或者Velocity等现成的文件式模板引擎。而…