如何设置单文档程序多语言版本
设置一个应用程序多语言版本,一般有两种方法,一种是使用动态链接库,将两种语言包放到动态链接库中,再根据选择调用相应的动态链接库就可以了.一种是使用文本编辑器编辑资源文件的方法,将资源文件的内容设置成两个不同版本的资源.程序运行时,根据用户的选择而调用不同的资源来实现.现介绍第二种方法.
1. 新建一单文档应用程序.命名为ChineseAndEnglish.
2. 在资源文件菜单的试图下添加一项,Caption为英文,ID为ID_MENU_CHANGE.右键点击新增加的Add Event Handler,在MessageType中选择COMMAND,在Class List中选择CMainFrame,Add and Edit,就会添加一个OnMenuChange()事件;
这与VC6.0有点不一样.
3. 在单文档应用程序的目录下找到ChineseAndEnglish.rc文件.用文本形式打开,可见到如下的文件内容,这里可以看到图标,位图,工具栏,对话框,菜单,字符串表等相关文件.我们要改动的主要是想让菜单有两个版本(中,英),,所以只需要改动菜单部分的资源,其他的省略.
//ChineseAndEnglish.rc文件内容
// 图标
// 位图
// 工具栏
// 菜单
IDR_MAINFRAME MENU
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建/tCtrl+N(&N)",
ID_FILE_NEW
MENUITEM "打开.../tCtrl+O(&O)",
ID_FILE_OPEN
MENUITEM "保存/tCtrl+S(&S)",
ID_FILE_SAVE
MENUITEM "另存为(&A)...",
ID_FILE_SAVE_AS
MENUITEM SEPARATOR
MENUITEM "打印.../tCtrl+P(&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 "撤消/tCtrl+Z(&U)",
ID_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "剪切/tCtrl+X(&T)",
ID_EDIT_CUT
MENUITEM "复制/tCtrl+C(&C)",
ID_EDIT_COPY
MENUITEM "粘贴/tCtrl+V(&P)",
ID_EDIT_PASTE
END
POPUP "视图(&V)"
BEGIN
MENUITEM "工具栏(&T)",
ID_VIEW_TOOLBAR
MENUITEM "状态栏(&S)",
ID_VIEW_STATUS_BAR
MENUITEM "
英文版
(&S)", ID_MENU_CHANG
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于 ChineseAndEnglish(&A)...",
ID_APP_ABOUT
END
END
//
在此后加入英文菜单资源复制上述文本,把其中的中文改成英文,并作些改动
IDR_MAINFRAME_ENGLISH 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 "Print Preview(&V)", ID_FILE_PRINT_PREVIEW
MENUITEM "Print Setting(&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_FULLSCREEN
MENUITEM "Chinese", ID_MENU_CHANGE
END
POPUP "Help(&H)"
BEGIN
MENUITEM "About FullScreen(&A)...", ID_APP_ABOUT
END
END
// 快捷键
// 对话框
// 版本
// 字符串表
改动后保存.再次打开资源项的时候会显示Opened in another editor,这时候只需要重新编译下,这些资源才能在.NET2003下看的到,改动后你可以看到新增加了个英文菜单.
下面解决的问题就是如何切换.
首先在
CMainFrame类中加入变量CMenu m_englistmenu 和m_chinesemenu用来保存中英文菜单资源,且加入变量enum Enum{e,c}m_current 保存当前菜单,也就是在MainFram.h头文件中添加如下代码
public:
enum Enum{e,c}m_current;/ /
用来保存当前菜单
CMenu m_englistmenu;//
用来保存英文菜单资源
CMenu m_chinesemenu;//
用来保存中文菜单资源
其次
由于默认为中文菜单
,
所以在
CMainFrame::CMainFrame()
中设置
m_current=c;
表示当前为中文菜单
CMainFrame::CMainFrame()
{
m_current=c;
}
接着
在
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
中装入英文菜单资源,即在OnCreate中return 0之前加入如下代码
m_englistmenu.LoadMenu("IDR_MAINFRAME_ENGLISH");
HMENU m_hMenu=::GetMenu(this->m_hWnd); //
保存中文菜单
m_chinesemenu.Attach(m_hMenu);
最后加入菜单改变函数
,
即为开始的
OnMenuChange
事件添加如下代码
:
void
CMainFrame::OnMenuChange()
{
if(m_current==e)
{
SetMenu(&m_chinesemenu);
m_current=c;
}
else
{
SetMenu(&m_englistmenu);
m_current=e;
}
}
如果新的菜单出现中文乱码的问题,可以通过在左侧资源列表中右击你要编辑的那个资源,打开属性,然后把语言改成
Chinese(P.R.C)就行了.
未完待续……