如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结。

我们使用vc6.0的版本来试验

1. 切换到资源视图,右键Dialog->Insert Copy

2. ok后,会出来一个语言的选项,这里可以根据需要选择语言

3. 点击ok后,出现一份copy,不过里面是英文的。

  这时,如果你源对话框中带中文的话在英文界面中就会显示乱码了。需要手动改为英文的。

①源对话框

    

② copy的对话框,手动修改成英文的就ok了。

    

4. 如何让程序显示正确的语言呢?

  我这边是通过写到ini文件里面去,比对是哪种语言,然后显示为哪种语言的。

  在InitInstance()函数里面添加判断。

  用到的函数有SetThreadUILanguage和SetThreadLocale,但SetThreadLocale不支持win7及以上版本,所以须做判断,是否为win7及以上版本,再决定用什么函数

来设置相应的语言。

  

    CString strValue,strCpyFile,strtemp,strLanguage;
char itemVal[];
int len;
GetModuleFileName(NULL,strValue.GetBuffer(MAX_PATH),MAX_PATH);
strValue.ReleaseBuffer();
len=strValue.ReverseFind('\\');
strValue=strValue.Left(len);
strtemp=strValue;
strtemp += "\\TestDll\\copyfiles.ini";
// 找到我写入的配置文件,copyfile.ini文件。
::GetPrivateProfileString("TestSequence","Language","",itemVal,,strtemp);
strtemp = itemVal;
strLanguage = strtemp;
  // 这里区分了两种语言,我写入ini文件的是ENGLISH 和 CHINESE
if("ENGLISH" == strLanguage)
{
//SetThreadUILanguage();
if (IsWin7())
{
SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK));
}else
{
SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), SORT_DEFAULT));
} }else
  {
if (IsWin7())
{
SetThreadUILanguage(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK));
}else
{
SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK), SORT_DEFAULT));
}
}

  这里贴下IsWin7()函数的判断,其实是判断了win7及以上的版本。

  

bool IsWin7()
{
OSVERSIONINFOEX osvi;
BOOL bOsVersionInfoEx; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi); // win7的系统版本为NT6.1
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= && osvi.dwMinorVersion >= )
{
return true;
}
else
{
return false;
}
}

这里又有一个问题,SetThreadUILanguage该函数在vc6.0中不认识,在vs2008中是可以认识这个函数的,(vc6.0差不多是该被替换啦- -!)我们就采取动态获取的方式来操作。

typedef LANGID (WINAPI *FP_SetThreadUILanguage)(LANGID LangId);
LANGID SetThreadUILanguage(LANGID lcid)
{
HMODULE hKernel32 = GetModuleHandle(_T("Kernel32.dll"));
FARPROC pFn = GetProcAddress(hKernel32, "SetThreadUILanguage"); FP_SetThreadUILanguage pSetThreadUILanguage = (FP_SetThreadUILanguage)pFn; if (pSetThreadUILanguage)
{
return pSetThreadUILanguage(lcid);
}
return ;
}

5. 在设置切换语言的时候,可以设置一个combobox,点击哪个语言就进行语言切换,设置一个全局变量,然后PostMessage,关闭,在WM_ONCLOSE函数中再做一次打开操作。

大致就是这个过程。大家也可以自己发挥。

-------------------------------------

2014-07-12

有问题可以和我交流,谢谢

QQ:249451220

  

MFC多语言程序版本,在不同的windows系统上的使用的更多相关文章

  1. MFC多语言程序版本,在不同的windows系统上的使用 FP_SetThreadUILanguage

    from: http://www.cnblogs.com/qijicxl/p/3840157.html 如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结. 我们使用vc6.0的版本来试验 ...

  2. 在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面)

    在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面) (https://www.lfd.uci.edu/~gohlke/pythonlibs/) win10 ...

  3. Windows系统上的.Net版本和.NETFramework的C#版本

    前言 注:本文内容摘自维基百科,用于在墙内时当作笔记看. WinForm 需要.Net最低版本 2.0 WPF需要的.Net最低版本 3.0 (Win7及之上版本自带) C#版本 版本 语言规格 日期 ...

  4. 【转】如何查看Oracle客户端版本及位数(Windows系统)

    一.方法一 查看oracle客户端版本:sqlplus -v 查看oracle客户端版本:sqlplus /nolog命令 Step 1:运行sqlplus /nolog命令,如果你服务器安装了多个客 ...

  5. Windows系统上release版本程序bug跟踪解决方案-.dmp文件。

    使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...

  6. Windows系统上release版本程序bug跟踪解决方案(1)-日志记录

    使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...

  7. 二进制程序分析工具Pin在Windows系统中的安装和使用方法

    这篇日志其实很弱智,也是因为换了新电脑,实验环境不全(当然,做这个实验我是在虚拟机里,因为接下来想拿些恶意代码的数据),所以这里记录一下在Windows下怎么安装和使用Pin这个程序分析领域最常用的工 ...

  8. 【Tool】在Windows系统上,下载和安装当前最新版本的IDEA 2020-4-14

    下载 & 安装 IDEA 下载部分: 官网地址:https://www.jetbrains.com/idea/ 直接点击鲜眼的DOWNLOAD 如果仅仅是想简单接触学习下Java语言,社区版的 ...

  9. Windows系统上安装多个版本jdk,修改环境变量不生效

    本机已经安装了jdk1.6,而比较早期的项目需要依赖jdk1.5,于是同时在本机安装了jdk1.5和jdk1.6. 安装jdk1.5前,执行 java -version 得到java version ...

随机推荐

  1. 得到Android keystore签名的命令方法

    keytool -list -v -keystore keyfile.jks 上面这个命令是用来得到一些签名字符串,这些字符串用来在各种平台上填资料的 再来个手动签名的命令: jarsigner -v ...

  2. Django开发环境静态文件访问配置

    settings主要配置项目: STATIC_ROOT = 'D:\Dev\jpDev\czxg\assets' #这个地方是所在系统标准目录文法配置 STATIC_URL = '/static/' ...

  3. Sublime text 3 注册码激活码 版本号3143

    —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA ...

  4. golang使用通道模仿实现valatile语义

        golang团队在sync中提供了很多的原子操作函数,将原子操作转向由单独一个包提供,而不是像Java那样提供各种累,确实上手得更加简单.但是golang原生提供的并发操作没有Java来得丰富 ...

  5. java数据库基本操作(sqlserver 2000为例)

    一.环境搭建 1.下载对应数据库连接驱动包并引入. 2.如果在web中调用必须在tomcat中也放入对应的驱动包. 3.在jre的lib\ext中也加入对应的驱动包. 二.连接数据库 public s ...

  6. 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!

    今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...

  7. Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令

    SQL计划指令是Oracle12c中自适应查询优化的功能之一.SQL计划指令就像“额外的提醒” ,用以提醒优化器你先前选择了的计划并不是最优的,典型的是因为错误的势评估.错误的势评估往往是由统计信息缺 ...

  8. ThinkPHP5+Apicloud+vue商城APP实战

    ThinkPHP5+Apicoud+vue商城APP实战 目录 章节1:项目概述 课时1apicloud平台介绍.04:38 课时2知识体系架构介绍.16:10 章节2:apicloud50分钟快速入 ...

  9. Scrapy 1.4 文档 04 例子

    最好的学习方法是举例说明,Scrapy也不例外. 因此,我们有一个名为 quotesbot 的 Scrapy 项目,您可以通过它来学习更多关于 Scrapy 的知识. 它包含两个用于http://qu ...

  10. Load balancer does not have available server for client

    最近在研究spring-cloud,研究zuul组件时发生下列错误: Caused by: com.netflix.client.ClientException: Load balancer does ...