参考资料:

http://www.cnblogs.com/xiaoyusmile/p/3924931.html

http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html

通过以上两种方案总结实现动态软件支持多语言,不需要重新启动程序:

1:在应用程序.APP中添加两个函数:

//打开窗口

INT_PTR CMuliteLanguageApp::OpenWindow(void)
{
CMuliteLanguageDlg dlg;
m_pMainWnd = &dlg; 
INT_PTR nResponse=dlg.DoModal();
return nResponse;
}

//获取配置文件中的语言,并加载在线程中,该函数必须在窗口创建前调用
void CMuliteLanguageApp::LoadLanguage(void)
{

CString strFileName=_T("Language.ini");
if (PathFileExists(strFileName))
{
LCID lcidThread=0;
CFile file;
file.Open(strFileName,CFile::modeRead|CFile::typeBinary);
file.Read(&lcidThread,sizeof(LCID));
file.Close();
if (operatingSystem==win_win7)
{
SetThreadUILanguage(lcidThread);//是由于win7和xp系统调用的函数不一样,所以首先得到操作系统
}
else
{
SetThreadLocale(lcidThread);
}
m_curThreadID=lcidThread;
}
else
{
m_curThreadID=GetSystemDefaultLangID();//获取默认用户设置语言
}

}

//获取操作系统

//win_win7是自己定义的一个宏
INT_PTR CMuliteLanguageApp::GetOperatingSystem()
{
OSVERSIONINFO osvi;
BOOL bIsWindowsXPorLater;

ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

GetVersionEx(&osvi);
if (osvi.dwMajorVersion>=6&&osvi.dwMinorVersion>=0)
{
return win_win7;
}
else
{
return win_xp;
}
}

2.InitInstance()函数更改:

BOOL CMuliteLanguageApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
//CMuliteLanguageDlg dlg;
//m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal();

operatingSystem=GetOperatingSystem();
LoadLanguage();
INT_PTR nResponse = OpenWindow();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}

// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}

3.在对话框类中添加菜单响应函数:

void CMuliteLanguageDlg::OnLanguageSwitch()
{
// TODO: 在此添加命令处理程序代码
CMuliteLanguageApp*pApp = (CMuliteLanguageApp*)AfxGetApp();

//LCID lcidNew = GetThreadLocale();//win7时用GetThreadUILanguage();

lcidNew=pApp->m_curThreadID;
if (LANG_ENGLISH == PRIMARYLANGID(LANGIDFROMLCID(lcidNew)))
{
lcidNew = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
SORT_DEFAULT);
}
else
{
lcidNew = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
SORT_DEFAULT);
}

// 把语言设置写入配置文件
CFile file;
file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate|CFile::typeBinary);
file.Write(&lcidNew, sizeof(lcidNew));
file.Close();

//销毁当前窗口 
pApp->m_pMainWnd = NULL;
this->DestroyWindow();

//创建新的窗口
pApp->LoadLanguage();
pApp->OpenWindow();
}

方法二:加载动态库的方法

在.cpp应用文件

BOOL CTestMulitLanguageApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadLanguage();
OpenWindow();

// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}

int CTestMulitLanguageApp::GetLang(void)
{
return m_Lang;
}
void CTestMulitLanguageApp::LoadLanguage(void)
{
CString strDLL;
HINSTANCE hLanguageDll, hLanguageNow;

//保存本身的资源句柄
static HINSTANCE hOriginalHandle = ::AfxGetResourceHandle();

//读取ini配置文件
CString strFileName = _T("Language.ini");
if (PathFileExists(strFileName))

int lang = 0;
CFile file;
file.Open(strFileName, CFile::modeRead | CFile::typeBinary);
file.Read(&lang, sizeof(lang));
file.Close();
m_Lang = lang;
}

//根据用户喜好来设置
if (m_Lang == ENGLISH)//英文
hLanguageDll = ::AfxLoadLibrary(_T("English"));
else if (m_Lang == CHINESE)//中文
hLanguageDll = hOriginalHandle;
else
{
//用户未指定,则根据系统选择合适语言,默认为英文
WORD wLangPID = PRIMARYLANGID(GetSystemDefaultLangID()); 
if (wLangPID == LANG_CHINESE)
hLanguageDll = hOriginalHandle;
else if (wLangPID == LANG_ENGLISH)
hLanguageDll = ::AfxLoadLibrary(_T("English"));
else
hLanguageDll = ::AfxLoadLibrary(_T("English"));

//保存已加载的资源DLL句柄
hLanguageNow = ::AfxGetResourceHandle(); 
//加载新的资源DLL
if(hLanguageDll)
::AfxSetResourceHandle(hLanguageDll); 
//释放之前加载的资源DLL
if (hLanguageNow != hOriginalHandle)
FreeLibrary(hLanguageNow);
}
void CTestMulitLanguageApp::OpenWindow(void)
{
CTestMulitLanguageDlg dlg;
m_pMainWnd = &dlg; 
dlg.DoModal();
}

在dlg文件

void CTestMulitLanguageDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CTestMulitLanguageApp*pApp = (CTestMulitLanguageApp*)AfxGetApp();

int old_Lang = pApp->GetLang();
int new_Lang = 0;
if(old_Lang == ENGLISH)
new_Lang = CHINESE;
else
new_Lang = ENGLISH;

CFile file;
file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);
file.Write(&new_Lang, sizeof(new_Lang));
file.Close();

//销毁当前窗口 
pApp->m_pMainWnd = NULL;
this->DestroyWindow();

//创建新的窗口
pApp->LoadLanguage();
pApp->OpenWindow();
}

MFC开发软件支持多语言且同时支持xp和win7操作系统相关推荐

  1. html支持的脚本语言,能不能让日志内容在支持html语言的同时支持一下脚本语言,拜托!拜托!...

    日志里经常引用一个网站的歌,他们的歌曲网址有部分常改变,比如说dm1.hting.com/ht//部分,没准哪天就变成dm1.hting.com/as//. 所以我想在内容模板里声明一个变量.比如说用 ...

  2. 在程序中支持多语言环境,支持asp.net和winform。

    图一, 资源文件结构 根据上面的资源文件结构,在程序中调用资源选项应该是:control.Text = Resources.MultiString.SR.XXX. XXX返回的是哪种语言将根据你定义的 ...

  3. c语言编译程序的软件下载,c语言编译器(wintc)

    c语言编译器(wintc)是一款针对c语言编译的开发工具.c语言编译器(wintc)支持Windows平台开发程序,这款软件利用TC2为内核,提供了Windows平台的开发界面.这款具编译器具有语法加 ...

  4. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...

  5. c# 无法加载oraops.dll_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发.开发语言同样是基于.NET框架的C#语言或VB语言.Smart组件是Robotstudio软件中实现 ...

  6. 程序员的开发工具:Java语言开发人员常用软件

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华. 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦. 文章目录 一.前言 二.相关软件介绍: 1. IDEA(IntelliJ ID ...

  7. MFC开发股票看盘软件碰到的问题

    MFC开发股票看盘软件碰到的问题 MFC菜鸟,想用MFC做做股票看盘软件,天天度娘后,基本能显示相关股票信息,但同时也碰到较多问题没法解决.1. 刷新屏闪,获取即时数据后,2秒刷新,都会明显的闪烁.用 ...

  8. ios开发语言本地国际化_开发人员软件本地化最终语言指南

    ios开发语言本地国际化 There are lots of great guides out there for how to prep your product for international ...

  9. c#获取autocad安装位置_Robotstudio软件二次开发:基于C#语言的Smart组件开发基础

    Robotstudio软件除了支持Add-Ins插件的二次开发以外,还支持Smart组件的二次开发. 开发语言同样是基于 .NET框架的C#语言或VB语言. Smart组件是Robotstudio软件 ...

最新文章

  1. 2021年春季学期-信号与系统-第七次作业参考答案-第六小题
  2. Java设计模式(学习整理)---命令模式
  3. nginx+memcached+captcha_server实现验证码服务器
  4. Gh0st源码学习(三)生成DLL和DAT文件
  5. sklearn GridSearchCV网格搜索案例与代码
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的图书馆座位预约系统
  7. 解决eclipse报PermGen space内存溢出异常的问题
  8. 设计模式—结构型模式概述(思维导图)
  9. JavaScript性能优化之加载与执行
  10. linux 中断程序设计,linux – CPU0被eth1中断淹没
  11. 离散数学1 命题逻辑-基本的概念
  12. python计算矩阵的散度_数据集相似度度量之KLJS散度
  13. iptables详解(2):iptables管理
  14. 同济版《线性代数》引争议,从清华改用MIT数学课程看中美数学教育差距!
  15. 服务器虚拟化有什么好处
  16. When executing step qmake
  17. Pwnagotchi_waveshare_V3适配(海南大学)
  18. ​LeetCode刷题实战196:删除重复的电子邮箱
  19. R.Koo 改良后的分页类(主要是显示属性)
  20. 【源码】林业害虫检测小程序(可拓展美化)

热门文章

  1. iconfont图标引入及线上使用流程(无需下载图标到本地)
  2. nohup linux命令,Linux nohup命令
  3. 快手取消大小周,互联网大厂不卷了...
  4. 爬虫“入侵”王者六周年,拿来吧你
  5. 模块化开发工具webpack
  6. 英语口语练习系列-C16-钱
  7. 可知:南京满天飞的“毛絮”竟是虫子!
  8. pandas中如何计算一个时间序列有多少天
  9. tensorflow打印tensor有省略号问题
  10. lstm+crf 信息抽取 实体识别 代码