隨著電腦技術的快速發展,軟體的交流越來越頻繁,軟體的國際化已成為一個軟體開發人員不可迴避的一個問題。所謂軟體的國際化,就是讓軟體介面支援多種語言,從而可以被很多國家的人使用。為了使應用程式支援多種語言,一個很好的辦法就是使用動態連結程式庫,將不同的語言資源放入不同的庫中,根據需要程式載入不同的動態庫,從而實現程式的國際化。但是這種方法實現起來不很方便,對軟體開發人員要求較高,尤其是對於初學者,難度較大。為瞭解決這個問題,以實現多語言菜單為例,筆者介紹在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_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 |
BOOL LoadMenu( UINT nIDResource ); |
BOOL SetMenu( CMenu* pMenu ); |
///////////////////////////////////////////////////////// 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的不同值,將程式編譯成不同的語言版本。其實還可以在程式中添加菜單來讓使用者動態改變程式的菜單,具體實現方法讀者朋友們讀到這兒應該不會再有什麼疑惑了。另外,對於程式的動態菜單的實現,還有一種簡單的實現方法是隨應用程式發行一個文字檔,程式根據不容的需要從該文字檔中讀取不同的字串資源,然後將所讀取的字串做為"標題"賦給相應的功能表項目。 函數中的參數為一個指向菜單對象的指標。如果函數調用成功返回"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、 添加代碼,編譯運行程式。
三、程式碼 函數中的參數nIDResource是菜單資源的ID號。如果函數調用成功返回"TRUE",否則返回"FLASE"。
菜單資源裝載後,需要將該菜單設定為程式的當前菜單,這需要使用CWnd類的SetMenu()函數,該函數的原型如下: 修改過程式的資源檔並存檔退出後,接著要作的是在程式的CMainFrame類中加入變數CMenu m_CurrentMenu對象,用來根據需要裝載中文或英文菜單資源。CMenu類是MFC提供的管理菜單的類,該類的LoadMenu()函數來裝載菜單資源,函數的原型如下: 將上述內容複寫一份,拷貝到該資源檔的後面,並將上面內容的第一行修改為"IDR_English_MAINFRAME MENU PRELOAD DISCARDABLE",這樣作也就是為英文菜單起了一個叫"IDR_MAINFRAME_ENGLISH"的名字。最後將各個功能表項目的中文說明修改為英文說明,內容如下: