Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14517775
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:01:05

下载本文示例代码
  随着计算机技术的快速发展,软件的交流越来越频繁,软件的国际化已成为一个软件开发人员不可回避的一个问题。所谓软件的国际化,就是让软件界面支持多种语言,从而可以被很多国家的人使用。为了使应用程序支持多种语言,一个很好的办法就是使用动态链接库,将不同的语言资源放入不同的库中,根据需要程序加载不同的动态库,从而实现程序的国际化。但是这种方法实现起来不很方便,对软件开发人员要求较高,尤其是对于初学者,难度较大。为了解决这个问题,以实现多语言菜单为例,笔者介绍在VC编程中一种简单实现方法,从而实现软件的国际化支持。下图一给出了中英文菜单的应用程序界面: (a)中文菜单 (b)英文菜单 图一、多语言菜单支持的应用程序  一、实现方法  假如Visual C 6.0中生成的应用程序默认的菜单为中文,我们为了使应用程序的菜单支持英文,首先需要给应用程序添加英文菜单,读者朋友首先想到的可能是利用Visual C 提供的资源编辑器,这种方法当然可行,但是还有一种更方便更快捷的方法。首先用Windows的小程序"记事本"以文本的形式打开项目中的资源文件(.rc文件),找到项目中的菜单文本,内容如下: IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGINPOPUP "文件(&F)"BEGINMENUITEM "新建(&N)\tCtrl N", ID_FILE_NEWMENUITEM "打开(&O)...\tCtrl O", ID_FILE_OPENMENUITEM "保存(&S)\tCtrl S", ID_FILE_SAVEMENUITEM "另存为(&A)...", ID_FILE_SAVE_ASMENUITEM SEPARATORMENUITEM "打印(&P)...\tCtrl P", ID_FILE_PRINTMENUITEM "打印预览(&V)", ID_FILE_PRINT_PREVIEWMENUITEM "打印设置(&R)...", ID_FILE_PRINT_SETUPMENUITEM SEPARATORMENUITEM "最近文件", ID_FILE_MRU_FILE1,GRAYEDMENUITEM SEPARATORMENUITEM "退出(&X)", ID_APP_EXITENDPOPUP "编辑(&E)"BEGINMENUITEM "撤消(&U)\tCtrl Z", ID_EDIT_UNDOMENUITEM SEPARATORMENUITEM "剪切(&T)\tCtrl X", ID_EDIT_CUTMENUITEM "复制(&C)\tCtrl C", ID_EDIT_COPYMENUITEM "粘贴(&P)\tCtrl V", ID_EDIT_PASTEENDPOPUP "查看(&V)"BEGINMENUITEM "工具栏(&T)", ID_VIEW_TOOLBARMENUITEM "状态栏(&S)", ID_VIEW_STATUS_BARENDPOPUP "帮助(&H)"BEGINMENUITEM "关于 MutiLanguageMenu(&A)...", ID_APP_ABOUTENDEND  将上述内容复制一份,拷贝到该资源文件的后面,并将上面内容的第一行修改为"IDR_English_MAINFRAME MENU PRELOAD DISCARDABLE",这样作也就是为英文菜单起了一个叫"IDR_MAINFRAME_ENGLISH"的名字。最后将各个菜单项目的中文说明修改为英文说明,内容如下: "IDR_Englishi_MAINFRAME MENU PRELOAD DISCARDABLE" BEGINPOPUP "File(&F)"BEGINMENUITEM "New(&N)\tCtrl N", ID_FILE_NEWMENUITEM "Open(&O)...\tCtrl O", ID_FILE_OPENMENUITEM "Save(&S)\tCtrl S", ID_FILE_SAVEMENUITEM "Save As(&A)...", ID_FILE_SAVE_ASMENUITEM SEPARATORMENUITEM "Print(&P)...\tCtrl P", ID_FILE_PRINTMENUITEM "PrintView(&V)", ID_FILE_PRINT_PREVIEWMENUITEM "Print Setup(&R)...", ID_FILE_PRINT_SETUPMENUITEM SEPARATORMENUITEM "Recent Files", ID_FILE_MRU_FILE1,GRAYED MENUITEM SEPARATORMENUITEM "Exit(&X)", ID_APP_EXITENDPOPUP "Edit(&E)"BEGINMENUITEM "Undo(&U)\tCtrl Z", ID_EDIT_UNDOMENUITEM SEPARATORMENUITEM "Cut(&T)\tCtrl X", ID_EDIT_CUTMENUITEM "Copy(&C)\tCtrl C", ID_EDIT_COPYMENUITEM "Paste(&P)\tCtrl V", ID_EDIT_PASTEENDPOPUP "View(&V)"BEGINMENUITEM "ToolBar(&T)", ID_VIEW_TOOLBARMENUITEM "StatusBar(&S)", ID_VIEW_STATUS_BARENDPOPUP "Help(&H)"BEGINMENUITEM "About MutiLanguageMenu(&A)...", ID_APP_ABOUTENDEND  修改过程序的资源文件并存盘退出后,接着要作的是在程序的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的不同值,将程序编译成不同的语言版本。其实还可以在程序中添加菜单来让用户动态的改变程序的菜单,具体实现方法读者朋友们读到这儿应该不会再有什么疑惑了。另外,对于程序的动态菜单的实现,还有一种简单的实现方法是随应用程序发行一个文本文件,程序根据不容的需要从该文本文件中读取不同的字符串资源,然后将所读取的字符串做为"标题"赋给相应的菜单项。 编辑推荐:深入浅出Visual C 动态链接库编程   随着计算机技术的快速发展,软件的交流越来越频繁,软件的国际化已成为一个软件开发人员不可回避的一个问题。所谓软件的国际化,就是让软件界面支持多种语言,从而可以被很多国家的人使用。为了使应用程序支持多种语言,一个很好的办法就是使用动态链接库,将不同的语言资源放入不同的库中,根据需要程序加载不同的动态库,从而实现程序的国际化。但是这种方法实现起来不很方便,对软件开发人员要求较高,尤其是对于初学者,难度较大。为了解决这个问题,以实现多语言菜单为例,笔者介绍在VC编程中一种简单实现方法,从而实现软件的国际化支持。下图一给出了中英文菜单的应用程序界面: (a)中文菜单 (b)英文菜单 图一、多语言菜单支持的应用程序  一、实现方法  假如Visual C 6.0中生成的应用程序默认的菜单为中文,我们为了使应用程序的菜单支持英文,首先需要给应用程序添加英文菜单,读者朋友首先想到的可能是利用Visual C 提供的资源编辑器,这种方法当然可行,但是还有一种更方便更快捷的方法。首先用Windows的小程序"记事本"以文本的形式打开项目中的资源文件(.rc文件),找到项目中的菜单文本,内容如下: IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGINPOPUP "文件(&F)"BEGINMENUITEM "新建(&N)\tCtrl N", ID_FILE_NEWMENUITEM "打开(&O)...\tCtrl O", ID_FILE_OPENMENUITEM "保存(&S)\tCtrl S", ID_FILE_SAVEMENUITEM "另存为(&A)...", ID_FILE_SAVE_ASMENUITEM SEPARATORMENUITEM "打印(&P)...\tCtrl P", ID_FILE_PRINTMENUITEM "打印预览(&V)", ID_FILE_PRINT_PREVIEWMENUITEM "打印设置(&R)...", ID_FILE_PRINT_SETUPMENUITEM SEPARATORMENUITEM "最近文件", ID_FILE_MRU_FILE1,GRAYEDMENUITEM SEPARATORMENUITEM "退出(&X)", ID_APP_EXITENDPOPUP "编辑(&E)"BEGINMENUITEM "撤消(&U)\tCtrl Z", ID_EDIT_UNDOMENUITEM SEPARATORMENUITEM "剪切(&T)\tCtrl X", ID_EDIT_CUTMENUITEM "复制(&C)\tCtrl C", ID_EDIT_COPYMENUITEM "粘贴(&P)\tCtrl V", ID_EDIT_PASTEENDPOPUP "查看(&V)"BEGINMENUITEM "工具栏(&T)", ID_VIEW_TOOLBARMENUITEM "状态栏(&S)", ID_VIEW_STATUS_BARENDPOPUP "帮助(&H)"BEGINMENUITEM "关于 MutiLanguageMenu(&A)...", ID_APP_ABOUTENDEND  将上述内容复制一份,拷贝到该资源文件的后面,并将上面内容的第一行修改为"IDR_English_MAINFRAME MENU PRELOAD DISCARDABLE",这样作也就是为英文菜单起了一个叫"IDR_MAINFRAME_ENGLISH"的名字。最后将各个菜单项目的中文说明修改为英文说明,内容如下: "IDR_Englishi_MAINFRAME MENU PRELOAD DISCARDABLE" BEGINPOPUP "File(&F)"BEGINMENUITEM "New(&N)\tCtrl N", ID_FILE_NEWMENUITEM "Open(&O)...\tCtrl O", ID_FILE_OPENMENUITEM "Save(&S)\tCtrl S", ID_FILE_SAVEMENUITEM "Save As(&A)...", ID_FILE_SAVE_ASMENUITEM SEPARATORMENUITEM "Print(&P)...\tCtrl P", ID_FILE_PRINTMENUITEM "PrintView(&V)", ID_FILE_PRINT_PREVIEWMENUITEM "Print Setup(&R)...", ID_FILE_PRINT_SETUPMENUITEM SEPARATORMENUITEM "Recent Files", ID_FILE_MRU_FILE1,GRAYED MENUITEM SEPARATORMENUITEM "Exit(&X)", ID_APP_EXITENDPOPUP "Edit(&E)"BEGINMENUITEM "Undo(&U)\tCtrl Z", ID_EDIT_UNDOMENUITEM SEPARATORMENUITEM "Cut(&T)\tCtrl X", ID_EDIT_CUTMENUITEM "Copy(&C)\tCtrl C", ID_EDIT_COPYMENUITEM "Paste(&P)\tCtrl V", ID_EDIT_PASTEENDPOPUP "View(&V)"BEGINMENUITEM "ToolBar(&T)", ID_VIEW_TOOLBARMENUITEM "StatusBar(&S)", ID_VIEW_STATUS_BARENDPOPUP "Help(&H)"BEGINMENUITEM "About MutiLanguageMenu(&A)...", ID_APP_ABOUTENDEND  修改过程序的资源文件并存盘退出后,接着要作的是在程序的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的不同值,将程序编译成不同的语言版本。其实还可以在程序中添加菜单来让用户动态的改变程序的菜单,具体实现方法读者朋友们读到这儿应该不会再有什么疑惑了。另外,对于程序的动态菜单的实现,还有一种简单的实现方法是随应用程序发行一个文本文件,程序根据不容的需要从该文本文件中读取不同的字符串资源,然后将所读取的字符串做为"标题"赋给相应的菜单项。 编辑推荐:深入浅出Visual C 动态链接库编程 下载本文示例代码


用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序用VC 打造有多语言菜单的应用程序
阅读(201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~