MFC多国语言——配置文件
前段时间,因工作需要,本地化了一个英文版本的产品。
在网上查阅了若干资料,在此进行一个简单的整理。
在MFC程序中,实现多国语言的方式很多,我们选择的是使用配置文件的方法。
在通过配置文件方式实现多国语言功能时,主要的工作是:
1、将需要在界面上显示的文字保存到文件中。
2、在使用这些资源时,不是从rc文件中获取,而是从文件中加载,动态显示。
在配置文件中,需要保存各个资源的ID、各语言版本字符串的值。需要某个资源时,通过其ID查找到资源所在节点,获取相应语言的字符串值。
有一个问题是需要考虑的,资源的ID都是UINT类型的,如果在配置文件中以UINT类型的数值作为节点的ID,标识一个资源的话,不容易维护。
为解决这个问题, 我们可以借鉴.h文件中的做法。在.h文件中,为了易于维护,为每个UINT类型的ID都定义了相应的宏,例如:#define IDS_DATA 1001,而在rc文件中对该资源的定义为:IDS_DATA "Data"。这样,在程序中使用时只用IDS_DATA来代表"Data"。
在配置文件中,可以借鉴此做法。用一个XML文件来定义IDS_DATA与1001的对应关系;用另外一个文件来定义IDS_DATA与"Data"的对应关系。而维护资源的内容时,只需要修改资源内容的XML文件。
MFC程序中,主要有三种资源:Menu、Dialog、String。要根据每种资源的特点,来设计相应的方式保存这些资源的文字内容,便于根据资源ID获取相应的文字内容。
可以为每种资源封装一个公共方法,动态显示该资源的文本内容。
Menu
对Menu类的资源,可以封装一个公共函数,遍历Menu中的所有Item,为每个Item设置显示的文字。
如何从配置文件中获取Menu Item相应的字符串呢?需要根据配置文件的结构封装相应的方法。
在遍历菜单,设置各菜单项文字内容的过程中,需要的主要方法如下。
对于Popup Menu,设置Menu Text的方法:
ModifyMenu(hMenu, i, MF_BYPOSITION, i, menuStr);
对于String Menu,设置Menu Text的方法:
ModifyMenu(hMenu, nMenuID, MF_BYCOMMAND, nMenuID, menuStr);
获取菜单子菜单的方法:
HMENU hSubMenu = GetSubMenu(hMenu,i);
Dialog
对于Dialog类的资源,可以封装一个公共函数,遍历Dialog内的所有控件,为每个控件设置显示的文字内容。当然,还要设置Dialog的标题。
获取各控件字符串的方法需要根据Dialog资源配置文件的组织方式来订。
遍历Dialog,设置各控件文字内容时,需要用到的主要方法如下。
设置Dialog标题的方法:
::SetWindowText(hWnd,caption);
获取Dialog第一个子控件的方法:
HWND hSubWnd = GetWindow(hWnd,GW_CHILD);
获取Dialog子控件下一个控件的方法:
hSubWnd = GetWindow(hSubWnd,GW_HWNDNEXT);
利用以上两个方法,可以遍历Dialog中的所有控件。
判断子控件是否为Window的方法:
::IsWindow(hSubWnd)
通过以上判断,可以获知遍历是否完成。
String
对于String类的资源,配置文件结构很简单,只需要保存资源ID和各个语言版本对应的字符串值即可。
可以封装一个公共方法,根据ID从配置文件中获取字符串的值。
使用字符串资源的方式很多,例如:错误提示信息、Status Bar显示信息、ToolTip等等。主要的是,根据各种使用场合,如何修改相关代码,改为利用公共方法,从配置文件中读取字符串资源。
MFC多国语言——配置文件的更多相关文章
- MFC多国语言——资源副本
此随笔主要参考了http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html 为软件提供多国语言的支持的具体实现方法有很多,但基本原 ...
- MFC多国语言——资源DLL
此随笔中主要内容来自http://blog.csdn.net/china_hxx/article/details/10066655,原出处不详. 以下内容基于VC 6.0.要实现界面多语言化,必须要先 ...
- WinCE6.0多国语言软键盘
N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...
- 引擎设计跟踪(九.8) Gizmo helper实现与多国语言
最近把gizmo helper的绘制做好了. 1.为了复用代码,写了utility来创建sphere, cube, cylinder, plane, ring(line), circle(solid) ...
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...
- 使用 .toLocaleString() 轻松实现多国语言价格数字格式化
用代码对数字进行格式化,显然不是逢三位加逗号这么简单.比如印度在数字分位符号上的处理,就堪称业界奇葩: 印度的数字读法用“拉克”(十万)和“克若尔”(千万),数字标法用不对称的数位分离,即小数点左侧首 ...
- Visual Studio 2010 SP1 中文升级补丁ISO完整版下载 (含多国语言)
最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语. V ...
- Vnc自动登录器-多国语言绿色版
推荐:介绍一个VNC连接工具:iis7服务器管理工具.IIs7服务器管理工具可以批量连接并管理VNC服务器.作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器.vps ...
- 解析大型.NET ERP系统 多国语言实现
实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字..NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 ...
随机推荐
- Zookeeper的集群安装和配置
zk服务器集群规模不小于3个节点,要求各服务器之间系统时间要保持一致. 在master节点的/home/hadoop目录下,解压缩zk....tar.gz,具体安装的路径自选 解压后重命名该文件夹为z ...
- Selenium用法示例
收录待用,修改转载已取得腾讯云授权 前言 在上一节我们学习了PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运行的是 JavaScript 脚本,然而这就能写爬虫了吗?这又和Py ...
- iOS小技巧 - 如何生成范围随机数
生成[0, N-1]的随机数 NSUInteger r = arc4random_uniform(N); 生成[1, N]的随机数 NSUInteger r = arc4random_uniform( ...
- 输入N,打印如图所看到的的三角形(例:N=3,N=4,N=5)1<=N<=26
package demo; public class PrintDemo { public static void main(String[] args) { print(26); } private ...
- Unity3D研究院之脚本生成Android Google Project
一般安卓自动化打包直接会生成个APK出来,但是我不想生成APK,我想生成Eclipse项目. 然后在自动化完成后面的打包工作. 1 2 3 4 5 6 7 8 9 10 11 using Un ...
- 基于Jekyll的博客模板
代码地址如下:http://www.demodashi.com/demo/13147.html 效果 环境配置 环境 Windows 10 Git Bash 安装ruby 下载rubyinstalle ...
- 使用svn hooks 脚本post-commit时遇到的故障
由于网站上线,需要把新添加功能上传到测试环境进行测试,但由于程序员每天有大量的修改,如果总是登陆服务器手动更新svn工作副本(测试环境)太耗时耗精力,进而增加svn进行commit时,测试环境即时更新 ...
- HttpClient Coder Example
Example 1: HttpClient httpClient = new HttpClient(); httpClient.getHostConfigurati ...
- 神技do{}while(false)
神技do{}while(false) do{}while(false)或者说do{}while(0),本人在linux源码中学得,起初看起来比较奇怪,但在处理连续流程中特别有用,例如ABC三个流程,A ...
- RabbitMQ消息队基本概念
RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...