MFC程序双语言实现
2013-12-18 12:15
246 查看
1.对于“对话框”、“菜单”、“工具栏”三种的双语言实现采用MFC资源控制方式实现,例如:
1. 新建工程
新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是“中文”。
2. 添加多国语言的资源
在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。
为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:
(1) 打开Resource
View窗口。
(2) 右键IDD_MULTILANGUAGES,点击弹出菜单中的“Insert
Copy”菜单,如下图所示。
(3) 弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。
(4) 点击OK,即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。
使用同样的方法,也可以为其他资源添加多国语言版本的支持。主要需要多国版本需要支持的有对话框、菜单和字符串。
添加多国语言的资源后,要对这些资源进行不同语言的定制,根据资源对应的语言,设置对话框和控件的标题等。
程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User
Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言。设置线程语言的函数是SetThreadLocale。
设置线程语言为“中文”的代码如下:
SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));
设置线程语言为“英语(美国)”的代码如下:
SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));
设置线程语言要在对话框创建之前,否则无法更改对话框的资源。可以在CMultiLanguagesApp::InitInstance函数中的对话框初始化之前添加线程语言设置,分别设置为中文和英文语言,就可以查看到对话框界面的不同。
在MFC中实现的双语言切换功能类:
头文件:
class CLanguageManger
{
public:
~CLanguageManger();
static CLanguageManger* GetObj();
void InitLanguage();/* 初始化线程语言 */
BOOL SwitchLanguage(); /* 读取当前线程的语言,并根据当前线程语言进行语言切换,调用后应发送WM_CLOSE消息 */
void RestartExeAfterSwitchLanguage();/* 重启程序,实现界面重新加载,应在OnClose中调用 */
protected:
private:
CLanguageManger();
CLanguageManger(CLanguageManger & LanguageManger);
static bool
m_bRestart;
};
实现文件:
#define IDS_STR_CHINESE _T("Chinese")
#define IDS_STR_ENGLISH _T("English")
bool CLanguageManger::m_bRestart = false;
CLanguageManger::CLanguageManger()
{
}
CLanguageManger::~CLanguageManger()
{
}
CLanguageManger* CLanguageManger::GetObj()
{
static CLanguageManger languageManger;
return &languageManger;
}
void CLanguageManger::InitLanguage()
{
int langID = theApp.GetInt(_T("Language"),LANG_CHINESE);
LCID threadID;
if (LANG_ENGLISH == static_cast<WORD>(langID))
{
threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);
}
else
{
threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
}
SetThreadLocale(threadID);
m_bRestart = false;/* 初始化后取消重启标识 */
}
BOOL CLanguageManger::SwitchLanguage()
{
CString msg = TRANS_T("需要重新启动软件完成语言切换!\n是否继续?");
int ret = CUtilityTool::GetObj()->OkCancelDialog(msg);
if(ret == IDCANCEL)
return FALSE;
LCID threadID = GetThreadLocale();//Returns the locale identifier of the current locale for the calling thread.
int langID = 0;
if (LANG_ENGLISH ==
PRIMARYLANGID(//Extracts a primary language identifier from a language identifier.
LANGIDFROMLCID(threadID)//Retrieves a language identifier from a locale identifier.
)
)
{
threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);
langID = static_cast<int>(LANG_CHINESE);
}
else
{
threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
langID = static_cast<int>(LANG_ENGLISH);
}
/* 保存配置到注册表选项 */
if(!theApp.WriteInt(_T("Language"),langID))
return FALSE;
m_bRestart = true;/* 切换语言后置位重启标识 */
return TRUE;
}
void CLanguageManger::RestartExeAfterSwitchLanguage()
{
if(m_bRestart == true)/* 如果重启标识被置位则进行重启 */
{
CString moduleName = _T("");
GetModuleFileName(NULL,moduleName.GetBuffer(MAX_PATH),MAX_PATH);
ShellExecute(NULL,_T(""),moduleName,NULL,NULL,SW_SHOWNORMAL);
moduleName.ReleaseBuffer(MAX_PATH);
TRACE("重启退出");
}
else
{
TRACE("直接退出");
}
}
1. 新建工程
新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是“中文”。
2. 添加多国语言的资源
在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。
为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:
(1) 打开Resource
View窗口。
(2) 右键IDD_MULTILANGUAGES,点击弹出菜单中的“Insert
Copy”菜单,如下图所示。
(3) 弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。
(4) 点击OK,即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。
使用同样的方法,也可以为其他资源添加多国语言版本的支持。主要需要多国版本需要支持的有对话框、菜单和字符串。
添加多国语言的资源后,要对这些资源进行不同语言的定制,根据资源对应的语言,设置对话框和控件的标题等。
程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User
Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言。设置线程语言的函数是SetThreadLocale。
设置线程语言为“中文”的代码如下:
SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));
设置线程语言为“英语(美国)”的代码如下:
SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));
设置线程语言要在对话框创建之前,否则无法更改对话框的资源。可以在CMultiLanguagesApp::InitInstance函数中的对话框初始化之前添加线程语言设置,分别设置为中文和英文语言,就可以查看到对话框界面的不同。
在MFC中实现的双语言切换功能类:
头文件:
class CLanguageManger
{
public:
~CLanguageManger();
static CLanguageManger* GetObj();
void InitLanguage();/* 初始化线程语言 */
BOOL SwitchLanguage(); /* 读取当前线程的语言,并根据当前线程语言进行语言切换,调用后应发送WM_CLOSE消息 */
void RestartExeAfterSwitchLanguage();/* 重启程序,实现界面重新加载,应在OnClose中调用 */
protected:
private:
CLanguageManger();
CLanguageManger(CLanguageManger & LanguageManger);
static bool
m_bRestart;
};
实现文件:
#define IDS_STR_CHINESE _T("Chinese")
#define IDS_STR_ENGLISH _T("English")
bool CLanguageManger::m_bRestart = false;
CLanguageManger::CLanguageManger()
{
}
CLanguageManger::~CLanguageManger()
{
}
CLanguageManger* CLanguageManger::GetObj()
{
static CLanguageManger languageManger;
return &languageManger;
}
void CLanguageManger::InitLanguage()
{
int langID = theApp.GetInt(_T("Language"),LANG_CHINESE);
LCID threadID;
if (LANG_ENGLISH == static_cast<WORD>(langID))
{
threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);
}
else
{
threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
}
SetThreadLocale(threadID);
m_bRestart = false;/* 初始化后取消重启标识 */
}
BOOL CLanguageManger::SwitchLanguage()
{
CString msg = TRANS_T("需要重新启动软件完成语言切换!\n是否继续?");
int ret = CUtilityTool::GetObj()->OkCancelDialog(msg);
if(ret == IDCANCEL)
return FALSE;
LCID threadID = GetThreadLocale();//Returns the locale identifier of the current locale for the calling thread.
int langID = 0;
if (LANG_ENGLISH ==
PRIMARYLANGID(//Extracts a primary language identifier from a language identifier.
LANGIDFROMLCID(threadID)//Retrieves a language identifier from a locale identifier.
)
)
{
threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);
langID = static_cast<int>(LANG_CHINESE);
}
else
{
threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
langID = static_cast<int>(LANG_ENGLISH);
}
/* 保存配置到注册表选项 */
if(!theApp.WriteInt(_T("Language"),langID))
return FALSE;
m_bRestart = true;/* 切换语言后置位重启标识 */
return TRUE;
}
void CLanguageManger::RestartExeAfterSwitchLanguage()
{
if(m_bRestart == true)/* 如果重启标识被置位则进行重启 */
{
CString moduleName = _T("");
GetModuleFileName(NULL,moduleName.GetBuffer(MAX_PATH),MAX_PATH);
ShellExecute(NULL,_T(""),moduleName,NULL,NULL,SW_SHOWNORMAL);
moduleName.ReleaseBuffer(MAX_PATH);
TRACE("重启退出");
}
else
{
TRACE("直接退出");
}
}
相关文章推荐
- 在 MFC SDI 程序中实现多语言程序界面
- 在 MFC SDI 程序中实现多语言程序界面
- WinSock实现多线程网络文件传输程序(二)(MFC+WinSock 附源代码)
- MFC中基于对话框程序快捷键的实现
- 为你的MFC程序添加宏脚本语言
- MFC截图程序的实现(五)
- MFC截图程序的实现(六)
- MFC程序实现给对话框加入�背景图片
- [VC/MFC]一条语句实现程序运行时隐藏窗口
- Winform程序多语言国际化实现的简单方法
- MFC截图程序的实现(八)
- 牛顿插值函数C语言程序实现
- 程序语言的底层描述(4)——递归函数汇编栈帧实现
- 实现MFC多语言版本
- MFC - 资源文件实现多语言界面
- javascript实现C语言经典程序题
- MFC的多国语言界面的实现
- 程序语言的底层描述(5)——数组、指针的汇编实现以及C程序嵌入汇编
- 用PL/SQL语言编写一程序,实现按部门分段统计各个工资段的职工人数、以及各部门的工资总额
- [JAVA语言学习][小技巧]利用Batch批处理脚本实现控制台快速编译执行JAVA程序