隨著計算機技術的快速發展,軟件的交流越來越頻繁,軟件的國際化已成為一個軟件開發人員不可回避的一個問題。所謂軟件的國際化,就是讓軟件界面支持多種語言,從而可以被很多國家的人使用。為了使應用程序支持多種語言,一個很好的辦法就是使用動態鏈接庫,將不同的語言資源放入不同的庫中,根據需要程序加載不同的動態庫,從而實現程序的國際化。但是這種方法實現起來不很方便,對軟件開發人員要求較高,尤其是對于初學者,難度較大。為了解決這個問題,以實現多語言菜單為例,筆者介紹在VC編程中一種簡單實現方法,從而實現軟件的國際化支持。下圖一給出了中英文菜單的應用程序界面:
 (a)中文菜單
|  (b)英文菜單
|
圖一、多語言菜單支持的應用程序 |
一、實現方法
假如Visual C++6.0中生成的應用程序默認的菜單為中文,我們為了使應用程序的菜單支持英文,首先需要給應用程序添加英文菜單,讀者朋友首先想到的可能是利用Visual C++提供的資源編輯器,這種方法當然可行,但是還有一種更方便更快捷的方法。首先用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的不同值,將程序編譯成不同的語言版本。其實還可以在程序中添加菜單來讓用戶動態的改變程序的菜單,具體實現方法讀者朋友們讀到這兒應該不會再有什么疑惑了。另外,對于程序的動態菜單的實現,還有一種簡單的實現方法是隨應用程序發行一個文本文件,程序根據不容的需要從該文本文件中讀取不同的字符串資源,然后將所讀取的字符串做為
"標題
"賦給相應的菜單項。