MFC 多语言支持

在MFC中以资源方式实现多语言支持很简单,

只需要将对话框资源副本和字符串资源(String Table)的副本选择为需要支持的语言(程序运行过程中需要用到的字符串使用CString的LoadString方法从String Table中加载,不要直接赋值),翻译之后使用以下几行代码即可实现多语言支持.

	BOOL bXPLaterOS=FALSE;//是否为xp以后版本的os
	OSVERSIONINFO ovs; 
	ovs.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
	if (::GetVersionEx(&ovs)) 
	{ 
		bXPLaterOS = (ovs.dwPlatformId == VER_PLATFORM_WIN32_NT 
			&& ovs.dwMajorVersion >= 6 
			&& ovs.dwMinorVersion >= 0);//vista or later
	}   
	else
	{
		return FALSE;
	}
	int lang = GetSysLanguage();
	if(lan<0)
	{
		return FALSE;
	}

	if(lang == 1)
	{
		if(bXPLaterOS)
			SetThreadUILanguage(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
		else
			SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)); 
	}
	else if(lang == 0)
	{
		if(bXPLaterOS)
			SetThreadUILanguage(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED));
		else
			SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_DEFAULT));
	}
	else
	{
		AfxMessageBox(_T("Not Supported Language."));
		return FALSE;
	}

这里请注意SetThreadUILanguage和SetThreadLocale的参数, SetThreadUILanguage的参数是使用宏 MAKELANGID生成,

SetThreadLocale的参数是使用宏MAKELCID生成,当时本人两个参数都是使用宏MAKELCID,导致浪费了大半天时间.

实现多语言另外一种方式为使用资源DLL:

新建一个解决方案,并新建一个WIN32 DLL工程,创建完成后,在工程属性中将入口地址改为无(具体操作为:右键工程 ->属性 ->配置属性 ->链接器 ->高级,将无入口点改为"是"),在资源编译时添加编译条件(就像编译C/C++时定义的预处理宏一样,具体操作为:右键工程 ->属性 ->配置属性 ->资源 ->常规,在预处理定义处添加预处理宏):

1 编译中文(简体)资源时,添加宏定义:AFX_RESOURCE_DLL和AFX_TARG_CHS(这里假设在添加资源时没有设置编译条件)

2 编译英文(美国)资源时,添加宏定义:AFX_RESOURCE_DLL和AFX_TARG_ENU(这里假设在添加资源时没有设置编译条件)

3 exe工程中添加资源预处理宏AFX_RESOURCE_DLL

然后将工程的资源文件添加到工程(即rc文件),由于此处是将dll重新创建解决方案,所以默认情况下,生成的dll和exe不在同一个目录下,可以使用生成事件将生成的dll复制到exe目录(具体操作为:右键工程 ->属性 ->配置属性 ->生成事件 ->生成后事件,在命令行中填入命令copy $(OutDir)$(TargetName)$(TargetExt) exe目录)。

相关技巧使用:

一般在资源中会添加一些非语言性质的资源,如png、bmp、icon图片等,因为这些资源不论是英文还是中文环境,都是一样的,而在默认情况下,添加的这些资源都是以一种默认资源语言的形式添加到工程中的,因此需要修改这些资源的属性,选中待修改的资源(可以按住ctrl键同时选中多个或按住shift键连续选择多个),在属性中将将资源语言(Language)选择为“非特定语言”,在条件(Condition)中添加编译条件,该条件一般情况下指定为AFX_RESOURCE_DLL,因为在不同资源编译时,都会指定预处理宏AFX_RESOURCE_DLL,也可以指定为其他条件,如XXXX_RESOURCE,指定编译条件可以将一些特定的资源编译到exe或不同的dll中去(只需要在工程的资源预处理宏中定义好该条件即可),如系统有一个语言选择对话框,在用户未指定任何语言的情况下,启动程序时,需要显示该对话框让用户选择自己的语言,此时,需要将该对话框资源编译到exe文件中(因为未指定语言,所以无法确认将哪个dll资源Load到可执行程序),具体操作方法为:将对话框语言选择为“非特定语言”,条件添加XXXX_RESOURCE,在exe工程中添加资源预处理宏XXXX_RESOURC。
资源dll编译好后,只需要在exe工程的APP类的InitInstance函数中添加以下语句即可

HINSTANCE hLangRc=LoadLibrary(_T("xxxx.dll"));  
if(hLangRc != NULL)  
{
    AfxSetResourceHandle(hLangRc);
}
else
    do something


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)多语言切换可以通过以下几种方法实现。 1. 使用资源文件:MFC支持使用不同的资源文件来存储不同语言的文本、图像等资源。首先,创建一个基本语言资源文件(例如英文),然后创建其他语言资源文件,并将其命名为相应的语言代码(例如中文为zh-CN)。接下来,在代码中通过加载对应的资源文件来实现多语言切换。 2. 使用多语言库:使用第三方多语言库可以更方便地实现多语言切换。这些库可以根据当前系统的语言设置自动加载对应的语言资源,并在界面上显示正确的文本。常见的多语言库包括GetText、Qt Linguist等。 3. 使用资源文件字符串表:在资源文件中创建一个字符串表,其中包含所有需要多语言切换的文本。然后,在代码中根据用户设置的语言代码来加载对应的字符串,并在界面上显示。 4. 动态加载语言资源:通过编写一段代码来动态加载语言资源,将对应语言的文本赋值给相应的控件,并刷新界面。这种方法需要提前准备好不同语言的文本资源,并通过代码控制切换。 无论使用哪种方法,都需要在代码中添加逻辑来切换语言,可以通过用户界面设置、系统语言设置或其他方式来确定使用哪种语言。在切换语言后,需要重新加载相应的语言资源,并刷新界面以显示新的语言。 ### 回答2: MFC语言切换的实现方法主要有以下几种: 1. 使用资源文件:在MFC应用程序中,可以将不同语言的文本信息存储在不同的资源文件中,然后通过加载不同的资源文件来实现语言切换。每个资源文件都对应一种语言,通过读取不同的资源文件,可以获取相应语言的文本信息,并将其显示在界面上。 2. 使用国际化库:可以使用一些开源的国际化库,如gettext等,来实现MFC应用程序的多语言切换。这些库提供了一些函数和接口,可以根据当前的语言设置,从对应的语言文件中获取文本信息,并将其显示在界面上。 3. 手动切换语言:可以在代码中手动实现语言切换的逻辑。通过在程序中定义一些全局变量来表示当前的语言设置,然后根据不同的语言设置,从相应的语言文件中获取对应的文本信息,并将其显示在界面上。当需要切换语言时,可以通过用户的操作或者设置来改变当前的语言设置。 无论使用何种方法,都需要在应用程序的各个界面和对话框中统一使用资源文件或者函数来获取文本信息,从而实现整个应用程序的多语言切换。同时,还需要注意对齐文本的布局和调整控件的大小,以适应不同语言的文本长度和字符宽度的差异。 ### 回答3: MFC(Microsoft Foundation Classes)多语言切换可以通过以下几个步骤实现: 1. 提前准备好多语言资源文件:对于每一种语言,创建对应的字符串表和对话框资源文件,并为每个控件提供相应的文字和提示信息。 2. 在MFC应用程序的初始化过程中,根据用户所选语言加载对应的资源文件。可以通过读取系统的语言设置或者用户自定义选择来确定加载哪种语言资源文件。 3. 在应用程序的实例化和初始化完成之后,在每一个窗口的初始化过程中,调用相应的函数来切换语言。例如,可以使用 AfxSetResourceHandle 函数来设置当前语言资源句柄。 4. 在对话框或窗口类中重写虚函数 OnIniDialog 或 OnInitInstance,在函数中调用对应的语言切换函数,例如 SetWindowText 或 SetDlgItemText 来更新窗口中控件的文本。 5. 如果需要切换界面语言而不需要重启应用程序,可以在对话框的响应事件中或者菜单项的点击事件中调用相应的语言切换函数。例如,可以使用 SetWindowText 或 SetDlgItemText 来更新当前对话框中控件的文本。 6. 使用资源编辑器,为每个对话框和控件设置唯一的资源ID。然后,在代码中使用相应的ID来获取和设置对应的文本。可以通过调用 GetDlgItemText 或 SetDlgItemText 函数来实现。 通过以上步骤,我们可以在MFC应用程序中实现多语言切换,让用户能够根据自己的需求选择使用不同的语言界面。这样可以提高用户体验,使应用程序更具国际化和多元化特色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值