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的方案,使用资源文件 ...
随机推荐
- linux使用其它用户 su - op -c
su - op -c "whoami"
- LinkedIn是如何优化Kafka的
作者 张卫滨 发布于 2015年9月21日 转载 在LinkedIn的数据基础设施中,Kafka是核心支柱之一.来自LinkedIn的工程师曾经就Kaf ...
- DEDECMS爆严重安全漏洞
简要描述: 众所周知,因使用简单.客户群多,织梦CMS一直被爆出许多漏洞.“DEDECMS爆严重安全漏洞,近期官方会发布相关补丁,望大家及时关注补丁动态.” 详细说明: http://www.xx.c ...
- Python 自用代码(调整日期格式)
2017年6月28日 to 2017-06-282017年10月27日 to 2017-10-272017年12月1日 to 2017-12-012017年7月1日 to 2017-07-01 #co ...
- 转:ios的crash框架方法论
http://www.cocoachina.com/ios/20150701/12301.html 1. 其中提到的提高ios崩溃率的用法.
- Java Web---登录验证和字符编码过滤器
什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...
- [Spring boot] Integrating with h2 database
In pom.xml add dependency: <dependencies> <dependency> <groupId>org.springframewor ...
- nyoj237 游戏高手的烦恼(最小点覆盖)
题目237 题目信息 pid=237" style="text-decoration:none; color:rgb(55,119,188)">执行结果 本题排行 ...
- hdu5289 Assignment (区间查询最大值最小值,st算法...)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给定长度为n的序列a和一个整数K,找出最大值和最小值的差值小于K的区间.输出满足条件的区间的个 ...
- POJ3264 Balanced Lineup 【线段树】+【单点更新】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32778 Accepted: 15425 ...