通過ini實現多語言菜單

發表于:2007-07-14來源:作者:點擊數: 標簽:
下載本文的演示及源代碼(26K) http://263.csdn.net/FileBBS/files/2001_9/T_572_1.zip 從前看過vc知識庫上一篇《實現多語言菜單》的文章。那篇文章里采用的方法是在資源里定義兩個菜單,一個英文,一個中文... 要是程序要作成100國語言的用那種方法就十分不
下載本文的演示及源代碼(26K)  
http://263.csdn.net/FileBBS/files/2001_9/T_572_1.zip

    從前看過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<nCount;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);
   CString cs = AfxGetApp()->GetProfileString("menu",strText,strText);
   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的文字(就是在狀態欄上顯示的提示)
沒能顯示快捷鍵(菜單的為new Ctrl N的話將不正常)

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

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97