透過ini實現多語言選單 (轉)

worldblog發表於2007-12-10
透過ini實現多語言選單 (轉)[@more@]

 

透過ini實現多語言選單

 /FileBBS/files/2001_9/T_572_1.zip">本文的演示及(26K) 


  從前看過vc知識庫上一篇《實現多語言選單》的文章。那篇文章裡採用的方法是在資源裡定義兩個選單,一個英文,一箇中文...

  要是要作成100國語言的用那種方法就十分不妥了。原因是作者不可能會100國語言....最主要的是那樣十分不方便!

  最好的辦法就是把選單存到ini裡,由自行定義選單(要改成什麼就改成什麼)。


  下面111222嘗試用ini儲存選單做了一個演示工程。實現了透過ini修改選單項,透過這個你可以輕鬆的修改選單的語言,內容,更主要的是你可以把這些工作交給熱心的使用者....當然,這只是簡單的實現,還存在兩個問題,希望你能夠幫我完善它。


  首先,要修改選單項,你要熟悉CMenu的幾個。

 
  GetMenuItemCount();
  //獲取選單項數目

  GetMenuItemID(UNIT i); 
  //獲取選單項i的ID,這裡ID為0代表分割線,-1為POPUP選單項。

  GetMenuString( UINT nIDItem, CString& rString, UINT nFlags );
  //獲取選單項的字串

  ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
  //修改選單項,這裡我們主要是修改第4個引數,改變選單的文字。


接下來我寫了一個函式,利用遞迴遍歷所有的選單項按照ini檔案的設定修改選單項:


//函式宣告 MainFrm.h
void InitMenu(CMenu* menu);


/////////////////////////////////////////////////
//功能:多語言選單 MainFrm.cpp
//原理:遍歷選單項,替換選單項文字為ini檔案中的對應值
//// by 111222 9月13日
/////////////////////////////////////////////////
void CMainFrame::InitMenu(CMenu* menu)
{
 if(menu==NULL)
 return;
 int nCount = menu->GetMenuItemCount();//獲取該層選單數
 for(int i=0;i {
 int id = menu->GetMenuItemID(i);//檢視選單屬性,id=0為分割線,-1為popup選單
 if(id==0)
 {}
 else if(id==-1)
 {
 CString strText;
 menu->GetMenuString (i, strText, MF_BYPOSITION);//獲取選單文字
 CString cs = AfxGetApp()->GetProfileString("menu",strText,strText);//讀取選單項在ini裡的文字
 menu->ModifyMenu(i,MF_STRING|MF_BYPOSITION,id,cs);
 
 
 //  下面這行可有可無,用這個免得我們手工編輯ini,釋出的版本里註釋掉
 //AfxGetApp()->WriteProfileString("menu",strText,cs);
 
 CMenu* pSub = menu->GetSubMenu(i);
 InitMenu(pSub);//遞迴,遍歷popup選單
 }
 else
 {
 CString strText;
 menu->GetMenuString (i, strText, MF_BYPOSITION);

   strText.Replace(_T('t'),_T('_'));//解決't'無法使用GetProfileString的問題
 CString cs = AfxGetApp()->GetProfileString("menu",strText,strText);

  cs.Replace(_T('_'),_T('t'));//把上面的replace再變回來
 menu->ModifyMenu(i,MF_STRING|MF_BYPOSITION,id,cs);
 
 
 //  下面這行可有可無,用這個免得我們手工編輯ini,釋出的版本里註釋掉
 //  AfxGetApp()->WriteProfileString("menu",strText,cs);
 }
 }
}


函式的:

在CMainFrame::OnCreate的中填加上


  //multi language menu
  CMenu* pMenu = GetMenu();
  InitMenu(pMenu);


至此透過ini實現多語言選單結束了。
具體可以看演示程式。

menu.ini中儲存著每個選單項的文字,你只需要修改值就可以改換選單語言。

上面程式的不足:

沒能修改Prompt的文字(就是在狀態列上顯示的提示)

這個不足我還沒有著手解決,希望能解決的也給我些提示  to:111222@0451.com">111222@0451.com。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990812/,如需轉載,請註明出處,否則將追究法律責任。

相關文章