此前移植了wxWidget代码,将其编写成动态库,可用在MFC中!

相关代码在博客资源中,与文章同名。

1.移植wxWidget部分代码,生成DLL。

在wxLocale.h中定义了宏_(),目的是为了使用Poedit可以将_()中包含的内容搜索出来,利用了wxWidget制作多语言的方便。

http://d.download.csdn.net/down/3418287/songly1

2.将生成的wxLocale.h,LanguageLib.lib,LanguageLib.dll加入。

3.在app头文件中包含#include "wxLocale.h"

并在app类中定义

void SelectLanguage(int nLanguage);
wxLocale* m_local;

4.在app的cpp文件中

void CMultiLanguageWxApp::SelectLanguage(int nLanguage)
{
 if(m_local != NULL)
  m_local->Release();

m_local = CreateObject(nLanguage);
 if(m_local != NULL)
 {
  bool bRet = false;
  switch (nLanguage)
  {
  case wxLocale::wxLANGUAGE_ENGLISH:
   bRet = m_local->AddCatalog(_T("Languages//en.mo"));
   break; 
  case wxLocale::wxLANGUAGE_CHINESE_SIMPLIFIED:
   bRet = m_local->AddCatalog(_T("Languages//zhcn.mo"));
   break;
  case wxLocale::wxLANGUAGE_CHINESE_TAIWAN:
   bRet = m_local->AddCatalog(_T("Languages//zh.mo"));
   break;

}
  if(!bRet)
  {
   AfxMessageBox(_("Language package is not find!"));
  }
 }
}

5.菜单内容多语言

在MainFraim中增加函数,函数中所有需要转换的字符用_();(记住不是_T()哟)。

ChangeLanguage()
{
 CMenu* pSubMenu;
 CMenu* pMenu = GetMenu();
 if(pMenu != NULL)
 {
  pMenu->ModifyMenu(0,MF_BYPOSITION,0,_("文件(&F)"));
  pSubMenu = pMenu->GetSubMenu(0);
  if(pSubMenu != NULL)
  {
   pSubMenu->ModifyMenu(ID_FILE_NEW,MF_BYCOMMAND,ID_FILE_NEW,_("新建(&N)/tCtrl+N"));
   pSubMenu->ModifyMenu(ID_FILE_OPEN,MF_BYCOMMAND,ID_FILE_OPEN,_("打开(&O).../tCtrl+O"));
   pSubMenu->ModifyMenu(ID_FILE_SAVE,MF_BYCOMMAND,ID_FILE_SAVE,_("保存(&S)/tCtrl+S"));
   pSubMenu->ModifyMenu(ID_FILE_SAVE_AS,MF_BYCOMMAND,ID_FILE_SAVE_AS,_("另存为(&A)..."));
   pSubMenu->ModifyMenu(ID_FILE_PRINT,MF_BYCOMMAND,ID_FILE_PRINT,_("打印(&P).../tCtrl+P"));
   pSubMenu->ModifyMenu(ID_FILE_PRINT_PREVIEW,MF_BYCOMMAND,ID_FILE_PRINT_PREVIEW,_("打印预览(&V)"));
   pSubMenu->ModifyMenu(ID_FILE_PRINT_SETUP,MF_BYCOMMAND,ID_FILE_PRINT_SETUP,_("打印设置(&R)..."));
   pSubMenu->ModifyMenu(9,MF_BYPOSITION, 0, _("最近的文件"));  //byPosition的方式
   //pSubMenu->ModifyMenu(ID_FILE_MRU_FILE1,MF_BYCOMMAND,ID_FILE_MRU_FILE1,_("最近的文件"));
   pSubMenu->ModifyMenu(ID_APP_EXIT,MF_BYCOMMAND,ID_APP_EXIT,_("退出(Q).../tCtrl+Q"));
  }

pMenu->ModifyMenu(1,MF_BYPOSITION,1,_("编辑(&E)"));
  pSubMenu = pMenu->GetSubMenu(1);
  if(pSubMenu != NULL)
  {
   pSubMenu->ModifyMenu(ID_EDIT_UNDO, MF_BYCOMMAND, ID_EDIT_UNDO, _("撤消(&U)/tCtrl+Z"));
   pSubMenu->ModifyMenu(ID_EDIT_CUT, MF_BYCOMMAND, ID_EDIT_CUT, _("剪切(&T)/tCtrl+X"));
   pSubMenu->ModifyMenu(ID_EDIT_COPY, MF_BYCOMMAND, ID_EDIT_COPY, _("复制(&C)/tCtrl+C"));
   pSubMenu->ModifyMenu(ID_EDIT_PASTE, MF_BYCOMMAND, ID_EDIT_PASTE, _("粘贴(&P)/tCtrl+V"));
  }

pMenu->ModifyMenu(2,MF_BYPOSITION,2,_("视图(&V)"));
  pSubMenu = pMenu->GetSubMenu(2);
  if(pSubMenu != NULL)
  {
   pSubMenu->ModifyMenu(ID_VIEW_TOOLBAR,MF_BYCOMMAND,ID_VIEW_TOOLBAR,_("工具栏(&T)"));
   pSubMenu->ModifyMenu(ID_VIEW_STATUS_BAR,MF_BYCOMMAND,ID_VIEW_STATUS_BAR,_("状态栏(&S)"));
  }

pMenu->ModifyMenu(3,MF_BYPOSITION,3,_("帮助(&H)"));
  pSubMenu = pMenu->GetSubMenu(3);
  if(pSubMenu != NULL)
  {
   pSubMenu->ModifyMenu(ID_APP_ABOUT,MF_BYCOMMAND,ID_APP_ABOUT,_("关于 MultiLanguageWx(&)..."));
   pSubMenu->ModifyMenu(ID_LANGUAGE_ENGLISH,MF_BYCOMMAND,ID_LANGUAGE_ENGLISH,_("英语"));
   pSubMenu->ModifyMenu(ID_LANGUAGE_CHINESE,MF_BYCOMMAND,ID_LANGUAGE_CHINESE,_("简体中文"));
  }
 }
 DrawMenuBar();
}

6.Toolbar提示多语言实现

Mainframe头文件手动加载消息afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult);

在Map如下

ON_COMMAND(ID_LANGUAGE_ENGLISH, &CMainFrame::OnLanguageEnglish)
 ON_COMMAND(ID_LANGUAGE_CHINESE, &CMainFrame::OnLanguageChinese)

函数实现

BOOL CMainFrame::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT*   pResult)  
{

ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

//   UNICODE消息  
 TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA*)pNMHDR;  
 TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW*)pNMHDR;

CString strTipText;  
 UINT    nID = (UINT)pNMHDR->idFrom;

switch (nID)
 {
 case ID_FILE_NEW:
  strTipText = _("新建(N)/tCtrl+N");
  break;
 case ID_FILE_OPEN:
  strTipText = _("打开(O).../tCtrl+O");
  break;
 case ID_FILE_SAVE:
  strTipText = _("保存(S)/tCtrl+S");
  break;
 case ID_EDIT_CUT:
  strTipText = _("剪切(&T)/tCtrl+X");
  break; ;
 case ID_EDIT_COPY:
  strTipText = _("复制(&C)/tCtrl+C");
  break;
 case ID_EDIT_PASTE:
  strTipText = _("粘贴(&P)/tCtrl+V");
  break;
 case ID_FILE_PRINT:
  strTipText = _("打印(&P).../tCtrl+P");
  break;
 case ID_APP_ABOUT:
  strTipText = _("关于 MultiLanguageWx(&)...");
  break;
 default:
  strTipText = _("");
  break;

}

#ifndef _UNICODE
 if (pNMHDR->code == TTN_NEEDTEXTA)
 {
  lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
 }
 else
 {
  _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
 }
#else
 if (pNMHDR->code == TTN_NEEDTEXTA)
 {
  _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
 }
 else
 {
  lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
 }
#endif

*pResult   =   0;

//   使工具条提示窗口在最上面  
 ::SetWindowPos(pNMHDR->hwndFrom,   HWND_TOP,   0,   0,   0,   0,SWP_NOACTIVATE|  
  SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);    
 return   TRUE;

}

7.about对话框的多语言

这个简单,直接加消息在OnInitDialog中重写。该例子只是改了标题因此只有一句话。

SetWindowText(_("关于 MultiLanguageWx(&)..."));

注意:如果是复杂对话框,需要对每个控件进行setText,而且static控件需要自定义ID。如果是嵌在View类的对话框,就是需要在每个对话框中添加一个setText的函数,该函数将所有控件重新设置。还需要在创建对话框类时创建全局的对象,每次切换语言的时候用全局的对话框类对象调用之前写的setText函数对每个控件重新设置。

8.最关键的是生成.mo文件

每种语言生成一个mo文件。如en.mo和zhcn.mo.

需要学会poedit的使用方法。(具体到网上查找,有详细的指导)

安装后,新建项目。设置如下图。

路径要是众多cpp文件目录下。而且保存生成的po文件也要在该目录下。

最后导入后,对每个自动查找到的项目进行设置。每个版本要设置一次,生成一个mo。然后对mo重命名为en.mo或zhch.mo。

以上就完成了多语言功能。详细的可以看例子。

http://download.csdn.net/source/3343701

注意:1.vc6.0的时候需要将工程设置改成Use Unicode Character Set。(待验证)

2.此方法最麻烦的是对poedit的初次使用,但是一旦学会了,你会发现poedit的强大之处。不解释。

MFC多语言方式——wxWidget多语言移植相关推荐

  1. 在 MFC SDI 程序中实现多语言程序界面

    下载: SdiML (34K,Visual C++ 6 项目) 今天举个例子,说说怎样使用 CLanguage 类,在 MFC SDI 程序中实现多语言程序界面. 因为 MFC 包装了一些字符串显示处 ...

  2. 程序的两种执行方式,静态语言和脚本语言

    程序的两种执行方式,静态语言和脚本语言 文章目录 程序的两种执行方式,静态语言和脚本语言 编译和解释 静态语言和脚本语言 编译和解释 编译:将源代码一次性转换成目标代码的过程.(编译一次后,若需再次执 ...

  3. 线性函数,C语言方式实现

    线性函数,C语言方式实现 GitHub仓库:https://github.com/XinLiGH/LinearFunction PS:博文不再更新,后续更新会在GitHub仓库进行. 线性函数,C语言 ...

  4. python语言只能以程序方式执行_Python语言程序设计

    零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有比较多的学校使用python作为入门编程语言.面向对象程序设计.连接数据源等基本知识,然后结 ...

  5. 【MFC进阶】09多国语言切换

    1.新建工程 新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是"中文". 2.添加多国语言的资源 在创建工程后,工程会添加默认的资源,如主对话框,都是& ...

  6. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

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

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

  8. 以下哪一个不属于python语言的特点-Python语言的特点有哪些

    Python语言的特点有哪些 Python 是目前最流行的语言之一,从云计算.大数据到人工智能,Python 无处不在,Python 人才需求量也在逐年攀升,Python 为何能发展如此的迅猛,究竟有 ...

  9. 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言概念辨析

    编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言概念辨析 转自:https://blog.csdn.net/u010533843/article/details/76215487 编译型和解 ...

最新文章

  1. Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档
  2. 怎么查看linux是不是as7u4,Linux下搭建Android开发环境
  3. python是烂语言吗
  4. java c 语言之父_Java之父评价C语言之父:他是一位天才,c语言撑起了一切
  5. 关于linux中的上下文切换
  6. 错误 1 未能找到类型或命名空间名称mysql_错误1未能找到类型或命名空间名称“DataPager”(是否缺少 using 指令或程序集引用?)...
  7. 2016年Google面筋记录
  8. U盘插在前面板不认,可以试试插在后面板
  9. LeetCode-1-two-sum
  10. 什么是微信二次开发,如何进行微信二次开发?
  11. PReLU, LReLU, ReLU
  12. 离散数学及其应用--第一章-命题逻辑的基本概念
  13. Linux Centos7 测试硬盘IO速度
  14. 读书百客:《千秋岁·淡烟平楚》赏析
  15. 从零开始搭建仿抖音短视频APP-开发用户业务模块(3)
  16. DGIOT国内首家轻量级物联网开源平台——支持工业设备租赁以及远程管控
  17. 图像分类的技能包及每一项的实验验证
  18. 海思16DV300系统搭建过程
  19. 冬天户外用嘴呼气冒“白气”,是气化现象
  20. 【系统分析师之路】系统安全章节错题集锦

热门文章

  1. 哔哩哔哩一直显示服务器繁忙,b站code504,为什么b站登录错误504
  2. 多线程的好处是什么?
  3. Unity3d transform.Find 找不到对象
  4. Java特点和特性详解
  5. 安卓手机、平板死机长按开机键10秒钟以后重启是如何做到的?
  6. golang学习之go fyne GUI编程
  7. 惠普136w耗材贵吗_入手解密惠普mfp136w与1136哪款好用点?差别是什么?优缺点内幕分析...
  8. 【教程】JQuery+css制作焦点图
  9. java民宿运营管理网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  10. 第七课511遇见易语言大漠找色FindCloer游戏外挂实例