vc 多語言菜單

來源:互聯網
上載者:User
隨著電腦技術的快速發展,軟體的交流越來越頻繁,軟體的國際化已成為一個軟體開發人員不可迴避的一個問題。所謂軟體的國際化,就是讓軟體介面支援多種語言,從而可以被很多國家的人使用。為了使應用程式支援多種語言,一個很好的辦法就是使用動態連結程式庫,將不同的語言資源放入不同的庫中,根據需要程式載入不同的動態庫,從而實現程式的國際化。但是這種方法實現起來不很方便,對軟體開發人員要求較高,尤其是對於初學者,難度較大。為瞭解決這個問題,以實現多語言菜單為例,筆者介紹在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"的名字。最後將各個功能表項目的中文說明修改為英文說明,內容如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.