【MFC】MFC的多国语言界面的实现

       目前很多软件都要出口到多个国家,因此为软件提供多国语言支持就成为了一个基本条件。为软件提供多国语言的支持的具体实现方法有很多,但基本原理都差不多,就是实现代码和语言包的独立,代码根据设定的语言选择语言包。

1、新建工程

新建一个MFC应用程序,单文档类型,点击“完成”。工程名称为MultiLanguages,默认语言选择为“中文”。

2、新建项目

右键点击 解决方案,添加->新建项目->MFC DLL,项目名称为MultiLanguagesEN,其他为默认。

3、插入副本

在资源视图中,右键点击 插入副本->选择 英语,使用同样的方法,为其他资源添加英文副本,并将资源视图中英文界面中的所有文本翻译成英文。

4、添加外文版

资源视图->Menu->IDR_MAINFRAME 中的 帮助 菜单下添加 英文版选项,并添加事件处理程序OnEnglish()

添加的代码如下:

void CMainFrame::OnEnglish()
{
	// TODO: 在此添加命令处理程序代码
	int iRet;
	if(TRUE == theApp.GetLang())
	{
		iRet = MessageBox(_T("确定切换到英文版本?"),_T("提示"),MB_OKCANCEL|MB_ICONINFORMATION);
	}
	else
	{
		return;
	}
	if(TRUE == IDCANCEL)
	{
		return;
	}

	theApp.SetLang(False);
	theApp.g_bRestart = TRUE;
	SendMessage(WM_CLOSE);
}

5、添加SetLang(),GetLang()

在MultiLanguages.cpp中添加函数SetLang(),GetLang()

添加的代码如下:

void CMulitiLanguagesApp::SetLang(BOOL bEnglish)
{
	CString strPath;
	AfxGetModuleFileName(AfxGetInstanceHandle(),strPath);
	int iPathLen = strPath.ReverseFind(_T('\\'));
	strPath = strPath.Left(iPathLen);

	CString strTemp;
	strTemp.Format(_T("%d"), bEnglish);
	WritePrivateProfileString(_T("English"),_T("bEnglish"), strTemp, strPath + _T("\\set.lang"));
}

BOOL CMulitiLanguagesApp::GetLang(void)
{
	CString strPath;
	AfxGetModuleFileName(AfxGetInstanceHandle(),strPath);
	int iPathLen = strPath.ReverseFind(_T('\\'));
	strPath = strPath.Left(iPathLen);

	BOOL bEnglish = GetPrivateProfileInt(_T("English"),_T("bEnglish"), 0, strPath + _T("\\set.lang"));

	return bEnglish;
}

6、添加中文版

资源视图->Menu->IDR_MAINFRAME[英语] 中的 帮助 菜单下添加 Chinese Version 选项,并添加事件处理程序OnChinese() 。添加的代码如下:

void CMainFrame::OnChinese()
{
	int iRet;

	if(FALSE == theApp.GetLang())
	{
		iRet = MessageBoxEx(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),_T("Really change to Chinese version?"),_T("Information"),MB_OKCANCEL | MB_ICONINFORMATION ,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
	}
	else
	{
		return;
	}
	if(iRet == IDCANCEL)
	{
		return;
	}

	theApp.SetLang(TRUE);
	theApp.g_bRestart = TRUE;
	SendMessage(WM_CLOSE);
}

7、在MulitiLanguages.cpp的InitStance()函数中添加如下代码

if(FALSE == GetLang())
	{
		m_hLangDLL = ::LoadLibrary(_T("MulitiLanguagesEN.dll"));
		if( !m_hLangDLL )
		{
			AfxMessageBox(_T("Unable to load resourse MulitiLanguagesEN.dll!"));
			return FALSE;
		}
		AfxSetResourceHandle(m_hLangDLL);
	}

8、切换中英文时重启界面

在MulitiLanguages.cpp的ExitInstance()函数中添加如下代码:

int CMulitiLanguagesApp::ExitInstance()
{
	AfxOleTerm(FALSE);
	if(m_hLangDLL)
	{
		FreeLibrary(m_hLangDLL);
	}

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

	}
	g_bRestart = FALSE;
	return CWinAppEx::ExitInstance();

9、最终的中英文界面

注意:

1、需要在Chinese Version选项属性界面修改ID号数字,不修改则会和 英文版 选项的 ID号重复

2、需要在ONCOMMAND(ID_English,&CMainFrame::On English)下手动添加ONCOMMAND(ID_Chinese,&CMainFrame::On Chinese)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值