MFC多语言程序版本,在不同的windows系统上的使用 FP_SetThreadUILanguage
from: http://www.cnblogs.com/qijicxl/p/3840157.html
如何使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[256];
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,256,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 >= 6 && osvi.dwMinorVersion >= 0)
{
returntrue;
}
else
{
returnfalse;
}
}
这里又有一个问题,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);
}
return0;
}
5. 在设置切换语言的时候,可以设置一个combobox,点击哪个语言就进行语言切换,设置一个全局变量,然后PostMessage,关闭,在WM_ONCLOSE函数中再做一次打开操作。
大致就是这个过程。大家也可以自己发挥。
-------------------------------------
2014-07-12
有问题可以和我交流,谢谢
QQ:249451220
MFC多语言程序版本,在不同的windows系统上的使用 FP_SetThreadUILanguage的更多相关文章
- MFC多语言程序版本,在不同的windows系统上的使用
如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结. 我们使用vc6.0的版本来试验 1. 切换到资源视图,右键Dialog->Insert Copy 2. ok后,会出来一个语言的选 ...
- 在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面)
在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面) (https://www.lfd.uci.edu/~gohlke/pythonlibs/) win10 ...
- Windows系统上的.Net版本和.NETFramework的C#版本
前言 注:本文内容摘自维基百科,用于在墙内时当作笔记看. WinForm 需要.Net最低版本 2.0 WPF需要的.Net最低版本 3.0 (Win7及之上版本自带) C#版本 版本 语言规格 日期 ...
- 【转】如何查看Oracle客户端版本及位数(Windows系统)
一.方法一 查看oracle客户端版本:sqlplus -v 查看oracle客户端版本:sqlplus /nolog命令 Step 1:运行sqlplus /nolog命令,如果你服务器安装了多个客 ...
- Windows系统上release版本程序bug跟踪解决方案-.dmp文件。
使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...
- Windows系统上release版本程序bug跟踪解决方案(1)-日志记录
使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...
- 二进制程序分析工具Pin在Windows系统中的安装和使用方法
这篇日志其实很弱智,也是因为换了新电脑,实验环境不全(当然,做这个实验我是在虚拟机里,因为接下来想拿些恶意代码的数据),所以这里记录一下在Windows下怎么安装和使用Pin这个程序分析领域最常用的工 ...
- 【Tool】在Windows系统上,下载和安装当前最新版本的IDEA 2020-4-14
下载 & 安装 IDEA 下载部分: 官网地址:https://www.jetbrains.com/idea/ 直接点击鲜眼的DOWNLOAD 如果仅仅是想简单接触学习下Java语言,社区版的 ...
- Windows系统上安装多个版本jdk,修改环境变量不生效
本机已经安装了jdk1.6,而比较早期的项目需要依赖jdk1.5,于是同时在本机安装了jdk1.5和jdk1.6. 安装jdk1.5前,执行 java -version 得到java version ...
随机推荐
- linux crontab命令 自动下载文件
#crontab -e#download stock data, Mon-Fri, 9:15 - 11:30, 13:00 - 15:0015,30,40,50 9 * * 1-5 (cd /home ...
- 杭电1025Constructing Roads In JGShining's Kingdom
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1025 题目: Problem Description JGShining's kingdom consis ...
- HDU - 6321 Problem C. Dynamic Graph Matching (状压dp)
题意:给定一个N个点的零图,M次操作,添加或删除一条边,每一次操作以后,打印用1,2,...N/2条边构成的匹配数. 分析:因为N的范围很小,所以可以把点的枚举状态用二进制表示集合.用一维数组dp[S ...
- 二叉树、平衡二叉树、B-Tree与B+Tree
本文总结自:https://blog.csdn.net/chuixue24/article/details/80027689 二叉树(B树,binary tree) 左子树的键值 < 根的键值 ...
- Linux图形化界面下使用命令进行截图的方法
以前在LINUX里面截图都是直接按print screen键或者 alt + print screen. 但是print screen是整个屏幕, alt + print screen是当前窗口. 想 ...
- dedecms 织梦利用arcpagelist标签实现首页arclist分页
DedeCMS首页arclist分页可以利用arcpagelist标签来实现,这里说一下调用方法:首先必须在首页的<head></head>标签里面引入如下js代码: < ...
- 使用Ant和YUICompressor链接合并压缩你的JS和CSS代码
JS代码和CSS代码在上线前要压缩大家应该都是知道的了.记得之前做项目的时候,最后要交差的时候是找了个网站,将JS代码的文件一个一个地复制,粘贴,复制,粘贴. 当时就在想:TMD有没有好一点的方法,劳 ...
- Linux平台下Oracle定时备份数据
临时收到一个任务,就是在生产环境上定时备份oracle的数据.空闲时间搞了一下,真是一波三折,过程有点小郁闷,结果哈哈.现在进行总结一下 (1)新建一个shell脚本test.sh #!/bin/ba ...
- Flume-NG中的Channel与Transaction关系(原创)
在sink和source中(不管是内置还是自定义的),基本都有如下代码,这些代码在sink中的process方法中,而在source中自己不需要去写,在source中getChannelProcess ...
- JNI简单步骤01
1.环境变量 1.1.相应的环境变量中,加入如下内容:(Windows) (1).ClASSPATH中输入 : ".;C:\Program Files\Java\jdk1.7.0_07\jr ...