参考http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html

MFC中英文切换实现过程中遇到的问题

最近在开发一个测试工具,因交付的使用对象是攻城狮,为使气质与之匹配,故而选用了MFC开发框架。

收尾阶段,boss希望能添加上中英文切换的功能,为不至于貂尾续狗,故而考虑直接使用MFC所支持的多语言资源。

基本思路是提供子菜单项,响应点击执行相关切换。因为窗口在初始化之初就根据当前语言环境加载了默认的资源文件,因而切换时必须重启应用才有效,为此考虑添加警示弹框,以免攻城狮在测试的过程中切换语言导致不必要的公司财产损失及人员伤残。

正传不多说,言归废话。

添加菜单项

插入一份英文资源副本


设置线程语言并保存至配置文件,以在重启时读入并配置

以下是切换成中文的部分响应代码:

    BOOL bXPLaterOS=isVistaOrLaterVersion();   //判断系统版本CID lcidNew;if(bXPLaterOS)lcidNew = GetThreadUILanguage();elselcidNew = GetThreadLocale();if(LANG_CHINESE == PRIMARYLANGID(LANGIDFROMLCID(lcidNew))){return;}INT_PTR nRes;nRes = MessageBoxEx(NULL,L"此操作将重启应用,是否继续?",L"警告",MB_YESNO,MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED));    if(nRes == IDYES){//do nothing}else if(nRes == IDCANCEL || nRes == IDNO) {return;}if(bXPLaterOS)lcidNew = MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);elselcidNew = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);// 写入配置文件CFile file;file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);file.Write(&lcidNew, sizeof(lcidNew));file.Close();// 关闭窗口m_bRestartFlag = TRUE;PostMessage(WM_CLOSE, 0, 0);

OnClose()中添加相应重启代码

    //...if (m_bRestartFlag){CString strFileName = _T("");GetModuleFileName(NULL, strFileName.GetBuffer(MAX_PATH), MAX_PATH);ShellExecute(NULL, _T(""), strFileName, NULL, NULL, SW_SHOWNORMAL);strFileName.ReleaseBuffer();}//...

重启应用,载入资源之前设置线程语言(程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言):

//以下代码添加在了BOOL C*App::InitInstance()中的
//CWinAppEx::InitInstance()语句之前
CString strFileName = _T("Language.ini");
if (PathFileExists(strFileName))
{LCID lcidThread = 0;CFile file;file.Open(strFileName, CFile::modeRead | CFile::typeBinary);file.Read(&lcidThread, sizeof(LCID));file.Close();if(bXPLaterOS)SetThreadUILanguage(lcidThread);
}

注:之所以使用isVistaOrLaterVersion()对系统版本进行判断是因为上述代码清单使用到的个别函数的兼容问题

function Minimum supported client
GetThreadUILanguage Windows Vista [desktop apps only]
GetThreadLocale Windows 2000 Professional [desktop apps only]
SetThreadUILanguage Windows XP [desktop apps only]
SetThreadLocale Windows 2000 Professional [desktop apps only]

另:Windows 2000/XP: Do not use SetThreadLocale to select a user interface language. To select the resource that is defined in the .rc file with a LANGUAGE statement, the application must use the Win32 FindResourceEx function.
大牛反汇编了下Kernel32.dll里面的LoadString,XP系统下的LoadString内部调用了FindResourceEx。SetTreadLocale会影响LoadString和FindResource,而不会影响FindResourceEx。因而,调用SetThreadLocale设置线程语言很可能无效。(经测试win7调用无效)

考虑下图中的数据,使用SetThreadUILanguage()设置线程语言;至于获取,判断当前Windows版本,XP使用GetThreadLocale(),Vista或以上使用GetThreadUILanguage()。


用着用着在XP中突然开始报错: “无法定位程序输入点 GetThreadUiLanguage 于动态链接库 KERNEL32.dll 上”。 没有一点点防备,也没有一丝顾虑,它就这样出现…于是使用最笨的方法判断当前是否需要切换语言:获取某个资源的窗口字符串判断其为何种语言。


看到有大牛推荐使用dll的方式支持多语言

???偶尔切换不成功是什么鬼

MFC中英文切换实现过程中遇到的问题相关推荐

  1. TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法

    TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法 问题概述 组态了中英文切换的多语言项目,有些应用场合在数值显示时需要标注单位,例如:摄氏度符号°C. 常见的问题是切换显示语言为 ...

  2. STA切换AP过程中,STA如何识别AP,AP又反馈什么信息给STA?

    AP如何识别STA NAI(Network Access Identifier)Realm.(802.11u中定义 ) NAI Realm ANQP (Access Network Query Pro ...

  3. jq 中英文切换_如何用js实现网站中英文切换?HTML中想把一段js语言转换为jq语言?...

    相关问题 vartb=$("");$.each(json,function(index,ele){vartr=$("tr");$.each(ele,functi ...

  4. android音频系统(7):通话过程中的音频输出设备切换

    前言:由于通话比较特殊,Android对于通话过程中音频输出设备的切换做了特殊处理,它在上层也是通过切换音频播放状态来完成切换操作的,android用CallAudioState来封装通话过程中的音频 ...

  5. win10自带输入法在切换中英文的过程中,出现了输入字符所占间距变大的问题

    问题描述 win10使用自带输入法,但是在切换中英文的过程中,出现了输入数字或者字母时,单字符所占间距变大的问题. 原因分析 这个现象产生的根本原因是,字符的全半角输入发生了变化.而当前采用全角输入. ...

  6. ae中英文切换_AE技巧,AE CC软件如何切换中英文版

    平时使用,中文界面更容易操作,但有时候需要切换成英文版使用,那AE怎么切换中英文界面呢?今天就来跟大家讲解一下切换语言界面的方法. 中文界面固然看着熟悉,对于入门来说也是非常有利的.但是,我们在学习过 ...

  7. qtabwidget切换tab事件_某超超临界机组初压/限压切换过程中扰动原因分析

    严寒夕  浙江浙能台州第二发电有限责任公司 [摘要]某火电厂汽轮机在初压/限压切换过程中出现负荷瞬时上升问题.从初压/限压切换的逻辑及切换过程中主要参数的变化分析,确定原因为压力控制器指令上升瞬间和转 ...

  8. xadmin在Django 1.11中的使用及中英文切换

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com xadmin是一个强大的替代django admin的管理后台,github地址为:https://g ...

  9. latex中biblatex参考文献的标点、分隔符、本地化字符串中英文切换

    latex中biblatex参考文献的标点.分隔符.本地化字符串中英文切换 引言 在中文环境下使用中文的标点符号是一个常见的需求,所以有时我们需要对这些符号进行中英文(全半角)切换.latex中利用b ...

最新文章

  1. 周志华《机器学习》章节整理
  2. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 序列实偶 傅里叶变换 实偶 | 序列实奇 傅里叶变换 虚奇 | 证明 “ 序列实奇 傅里叶变换 虚奇 “ )
  3. javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...
  4. HTTP协议中的Content-Encoding
  5. mysql删除记录后id不连续_小水玩转Mysql---Mysql跟踪sql记录
  6. 递归查找特定路径的所有特定文件
  7. 计算数组和以及平均值
  8. thinkphp内核独立版商城-萤火微信小程序商城(YoShop)
  9. 虚拟机体验NAS私人云(第四篇):虚拟机安装群晖DSM7.01系统(附赠新版DS918+和DS3615xs启动映像)
  10. (一)事务与并发控制
  11. Linux解决中文乱码问题及LANG与NLS_LANG的区别
  12. 2017年域名从Godaddy转移到Namesilo过程全记录
  13. iOS开发-ZFPlayer的简单使用 播放单个网络视频
  14. 学术研讨会---Micheal Stonebraker的主题演讲【读后感】
  15. python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)...
  16. Excel函数——小数点计算
  17. 移动端h5网页调用支付宝支付接口
  18. dubbo-go 白话文 | go 和 java 互通有无
  19. 金色传说:SAP-ABAP-SELECT * FORM 内表语法
  20. HaaS学习笔记 | 基于HaaS Python轻应用的LED跑马灯明细教程

热门文章

  1. 3.1集合的概念和表示法
  2. PDN电源完整性设计
  3. Python:按照指定行数打印文件内容
  4. 换个格式输出整数 蓝桥杯 C语言
  5. 永磁同步电机力矩控制simulink仿真,永磁同步发电机simulink控制
  6. oracle 中 in函数
  7. 让人混淆的Person p=new Person();和Person p=null;
  8. Data too long for column 'name' at row 1
  9. SpringMVC中的model是什么?
  10. My first job - Goodbaby Group in Shanghai