用VC++打造有多语言菜单的应用程序[转]

随着计算机技术的快速发展,软件的交流越来越频繁,软件的国际化已成为一个软件开发人员不可回避的一个问题。所谓软件的国际化,就是让软件界面支持多种语言,从而可以被很多国家的人使用。为了使应用程序支持多种语言,一个很好的办法就是使用动态链接库,将不同的语言资源放入不同的库中,根据需要程序加载不同的动态库,从而实现程序的国际化。但是这种方法实现起来不很方便,对软件开发人员要求较高,尤其是对于初学者,难度较大。为了解决这个问题,以实现多语言菜单为例,笔者介绍在VC编程中一种简单实现方法,从而实现软件的国际化支持。下图一给出了中英文菜单的应用程序界面:



(a)中文菜单


(b)英文菜单

图一、多语言菜单支持的应用程序

  一、实现方法

  假如Visual C++6.0中生成的应用程序默认的菜单为中文,我们为了使应用程序的菜单支持英文,首先需要给应用程序添加英文菜单,读者朋友首先想到的可能是利用VisualC++提供的资源编辑器,这种方法当然可行,但是还有一种更方便更快捷的方法。首先用Windows的小程序"记事本"以文本的形式打开项目中的资源文件(.rc文件),找到项目中的菜单文本,内容如下:

IDR_MAINFRAME MENU PRELOAD DISCARDABLE
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N)\tCtrl+N", ID_FILE_NEW
MENUITEM "打开(&O)...\tCtrl+O", ID_FILE_OPEN
MENUITEM "保存(&S)\tCtrl+S", ID_FILE_SAVE
MENUITEM "另存为(&A)...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "打印(&P)...\tCtrl+P", ID_FILE_PRINT
MENUITEM "打印预览(&V)", ID_FILE_PRINT_PREVIEW
MENUITEM "打印设置(&R)...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "最近文件", ID_FILE_MRU_FILE1,GRAYED
MENUITEM SEPARATOR
MENUITEM "退出(&X)", ID_APP_EXIT
END
POPUP "编辑(&E)"
BEGIN
MENUITEM "撤消(&U)\tCtrl+Z", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "剪切(&T)\tCtrl+X", ID_EDIT_CUT
MENUITEM "复制(&C)\tCtrl+C", ID_EDIT_COPY
MENUITEM "粘贴(&P)\tCtrl+V", ID_EDIT_PASTE
END
POPUP "查看(&V)"
BEGIN
MENUITEM "工具栏(&T)", ID_VIEW_TOOLBAR
MENUITEM "状态栏(&S)", ID_VIEW_STATUS_BAR
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于 MutiLanguageMenu(&A)...", ID_APP_ABOUT
END
END

 

将上述内容复制一份,拷贝到该资源文件的后面,并将上面内容的第一行修改为"IDR_English_MAINFRAME MENU PRELOAD DISCARDABLE",这样作也就是为英文菜单起了一个叫"IDR_MAINFRAME_ENGLISH"的名字。最后将各个菜单项目的中文说明修改为英文说明,内容如下:

"IDR_Englishi_MAINFRAME MENU PRELOAD DISCARDABLE"
BEGIN
POPUP "File(&F)"
BEGIN
MENUITEM "New(&N)\tCtrl+N", ID_FILE_NEW
MENUITEM "Open(&O)...\tCtrl+O", ID_FILE_OPEN
MENUITEM "Save(&S)\tCtrl+S", ID_FILE_SAVE
MENUITEM "Save As(&A)...", ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "Print(&P)...\tCtrl+P", ID_FILE_PRINT
MENUITEM "PrintView(&V)", ID_FILE_PRINT_PREVIEW
MENUITEM "Print Setup(&R)...", ID_FILE_PRINT_SETUP
MENUITEM SEPARATOR
MENUITEM "Recent Files", ID_FILE_MRU_FILE1,GRAYED
MENUITEM SEPARATOR
MENUITEM "Exit(&X)", ID_APP_EXIT
END
POPUP "Edit(&E)"
BEGIN
MENUITEM "Undo(&U)\tCtrl+Z", ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "Cut(&T)\tCtrl+X", ID_EDIT_CUT
MENUITEM "Copy(&C)\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste(&P)\tCtrl+V", ID_EDIT_PASTE
END
POPUP "View(&V)"
BEGIN
MENUITEM "ToolBar(&T)", ID_VIEW_TOOLBAR
MENUITEM "StatusBar(&S)", ID_VIEW_STATUS_BAR
END
POPUP "Help(&H)"
BEGIN
MENUITEM "About MutiLanguageMenu(&A)...", ID_APP_ABOUT
END
END

  修改过程序的资源文件并存盘退出后,接着要作的是在程序的CMainFrame类中加入变量CMenu m_CurrentMenu对象,用来根据需要装载中文或英文菜单资源。CMenu类是MFC提供的管理菜单的类,该类的LoadMenu()函数来装载菜单资源,函数的原型如下:

BOOL LoadMenu( UINT nIDResource );

  函数中的参数nIDResource是菜单资源的ID号。如果函数调用成功返回"TRUE",否则返回"FLASE"。

  菜单资源装载后,需要将该菜单设置为程序的当前菜单,这需要使用CWnd类的SetMenu()函数,该函数的原型如下:

BOOL SetMenu( CMenu* pMenu );

  函数中的参数为一个指向菜单对象的指针。如果函数调用成功返回"TRUE",否则返回"FLASE"。

  另外,为了能够动态的设置程序的菜单,还需要加入枚举变量enum Enum{e,c}m_Current。例如,如果当前需要将程序设置为"中文菜单",可以给m_Current一个初始值"c",如果该变量等于:"e"时说明项目选择了英文菜单。

  二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档视图结构的程序,命名为"MutiLanguageMenu";

  2、 启动Widows的"记事本"程序,修改程序的资源文件;

  3、 给应用程序的CmainFrame类添加CMenu类对象m_CurrentMenu以及枚举变量enum Enum{e,c}m_Current;
  
  4、 添加代码,编译运行程序。

  三、程序代码

/////////////////////////////////////////////////////////
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
  TRACE0("Failed to create toolbar\n");
  return -1; // fail to create
 }
 if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar\n");
  return -1; // fail to create
 }
 // TODO: Delete these three lines if you don‘t want the toolbar to
 // be dockable
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndToolBar);

  ////////////////////////////////////////////////////////////////////////////////////
  //多语言菜单实现
 if(m_Current==c)
  m_CurrentMenu.LoadMenu(IDR_MAINFRAME);
 else
  m_CurrentMenu.LoadMenu("IDR_English_MAINFRAME");
  SetMenu(&m_CurrentMenu);//设置界面菜单
  ////////////////////////////////////////////////////////////////////////////////////

 return 0;
}

  四、小结

  本实例中的代码通过设置m_Current的不同值,将程序编译成不同的语言版本。其实还可以在程序中添加菜单来让用户动态的改变程序的菜单,具体实现方法读者朋友们读到这儿应该不会再有什么疑惑了。另外,对于程序的动态菜单的实现,还有一种简单的实现方法是随应用程序发行一个文本文件,程序根据不容的需要从该文本文件中读取不同的字符串资源,然后将所读取的字符串做为"标题"赋给相应的菜单项。

转自:http://dev.yesky.com/88/2239588.shtml

时间: 2024-10-22 07:26:34

用VC++打造有多语言菜单的应用程序[转]的相关文章

CSS打造三级下拉菜单

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="keywords" content="站长,网页特效,js特效,广告代码,zzjs,zzjs.net,sky,www.zzjs.net,站长特效 网" /><meta name="d

VC++环境下多文档模板应用程序开发(带源码)

我们以前见到的关于VC++环境下利用APP Wizard 自动生成的MDI的应用程序只支持打开同一文档类型的多个文件,但是不能够同时打开不同种类型的文档.网上的这种公开资料比较少,我在知网上查阅了相关的资料.下面我根据这些资料做一下总结(辛辛苦苦一个一个字码出来的). 下面设计一个能够处理两种文档类型的应用程序:第一种文档类型:TXT文档,第二种文档类型:Bub的文档类型. 第一种的文档类型TXT,是利用APP Wizard自动生成的,只不过是在设置的时候将文档类型设置为TXT类型,并且使生成的

【VC编程技巧】窗体?3.7托盘程序介绍(模拟QQ消息)

所谓的托盘程序就是运行时在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标的程序.代表它运行的图标称作托盘图标.我们可以通过使用小图标来控制应用程序的状态. (一)NOTIFYICONDATA Structure typedef struct _NOTIFYICONDATA { DWORDcbSize;//结构体大小 HWNDhWnd;//接受icon消息的窗口句柄 UINT uID;//icon图标的资源Id UINTuFlags;//标志一些成员是否有效 UINTuCallbackM

在Android(Java)开发中如何实现类似C语言中的中断程序

在Android开发过程中,有时候会遇到这样的情况,在一个线程中,执行A操作,B操作需要等A操作结束后才进行,因此需要wait,在java中可以如下代码实现 Handler mBlueHandler = new Handler(Looper.getMainLooper()); Task task = new Task(); mBlueHandler.post(task); while (!task.finish) { synchronized (task) { try { task.wait()

iOS 多语言支持,应用程序国际化 xcode4.5

最近要对一款游戏进行多语言本地化,在网上找了一些方案,加上自己的一点点想法整理出一套方案和大家分享! 多语言在应用程序中一般有两种做法:一.程序中提供给用户自己选择的机会:二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法,主要分一下几点: 1.本地化应用程序名称2.本地化字符串3.本地化图片4.本地化其他文件 1.本地化应用程序名称 (1)点击"new file"然后在弹出窗口左侧选择IOS的resource

R语言-R调用C++程序

今天Mayuyu学习了如何利用R语言来调用C++程序.为什么要这么多呢? 因为R语言虽然方便,但是计算太慢了,尤其是在循环语句方面的使用,R语言简直是无法忍受,所以在R语言中为了提高速度,必要时候还得改用C++来实现. 在R语言中要调用C++是通过Rcpp这个包来实现的.所以要先安装Rcpp这个包咯!安装完成后Mayuyu就开始来写C++部分的代码了,框架如下图 在R语言传给C++的参数中,有R的各种类型,比如向量,矩阵等等.具体转化规则可以参考资料. 写完上述C++代码后,就可以来编译成*.s

微信公众号菜单添加小程序,miniprogram,pagepath参数详解,php开发公众号

随着微信小程序功能的开发, 已经可以跟公众号打通了, 主要有两种方式: 1) 在公众号文章中插入小程序 2) 在公众号菜单中添加小程序 第一种方式, 子恒老师在前面的课程已经详细介绍过, 今天来讲第二种方法, 怎么通过开发的方式实现. 一. 公众号菜单添加小程序请求的微信地址 https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN 其中 ACCESS_TOKEN 需要替换成你自己的 access token,

我的全栈之路-C语言基础之C程序运行流程

我的全栈之路-C语言基础之C程序运行流程 我的全栈之路 4.1 C程序的运行流程 C语言编写的程序一般都要经过编写源文件->预处理->编译->汇编->链接后运行这几个流程. 预处理 预处理主要是宏替换.包含头文件.条件编译以及删除注释等操作,预编译阶段生成文件的后缀名通常是.i. 编译 编译主要是将预处理好的文件生成汇编文件,编译后文件的后缀名通常是.s. 汇编 汇编主要是将汇编文件生成二进制文件,汇编后的文件的后缀名通常是.o. 链接 链接主要是将各个二进制文件.库函数.启动代码

使用纯资源DLL文件实现多语言菜单、界面文字、Tooltips等[转]

在使用vc写简繁体通用程序时,对实现菜单.界面.Tooltips等的文字时无法实现通用.如果写简体和繁体各一套程序,那肯定不现实.查找所有资料和文章都只能实现菜单的多语言,且使用起来也不方便:并且无法实现界面.Tooltips等的多语言.因而,采用纯资源的DLL文件来实现多语言. 纯资源DLL文件实现步骤如下: (1)创建简繁体MDI或SDI程序后,把VC框架自动创建的.rc,.rc2,.ico,.bmp等文件从程序框架中删除: (2)使用Projects的Win32 Dynamic-Link