麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

新設(shè)想——VC開發(fā)多語言界面支持的新招

2019-11-17 05:00:12
字體:
供稿:網(wǎng)友
  最近在做一個小程序,要求實現(xiàn)對多語言界面顯示支持功能,并且,界面顯示內(nèi)容用戶能夠自己設(shè)置。  初步設(shè)計用INI文件來配置顯示內(nèi)容,換一種語言的配置文件,就能夠更換整個系統(tǒng)的顯示語言。考慮到系統(tǒng)規(guī)模很小,周期又短,不想用太復(fù)雜的方案來解決這個問題,當參考了很多網(wǎng)上類似的設(shè)計和代碼,發(fā)現(xiàn)都不是很滿足。  主要問題在于:絕大多數(shù)基于INI文件配置這種簡單應(yīng)有實現(xiàn)的代碼,都是針對組件ID固定加載,寫死了組件的ID號,比如:  以下是引用片段:  strCaption = fileManager.GetString(section,"IDC_Stc_ListStudent","");  SetDlgItemText(IDC_Stc_ListStudent,strCaption);  strCaption = fileManager.GetString(section,"IDC_Stc_AllContent","");  SetDlgItemText(IDC_Stc_AllContent,strCaption);  這樣:界面組件越多,加載代碼越長;每新增一個顯示窗口,又必須復(fù)制、粘貼類似的代碼,根據(jù)組件ID常量值來修改相關(guān)的加載項,很是不爽!  初步設(shè)想是:設(shè)計統(tǒng)一、通用的窗口組件Caption設(shè)置方法,對給定的Frame或Dialog等Window容器組件內(nèi)的所以組件進行遍歷,當增、減顯示組件不對語言包加載代碼產(chǎn)生影響,達到自適應(yīng)界面組件語言包加載效果。  這樣就產(chǎn)生一個新問題:語言包配置文件中的Caption值如何跟相關(guān)的組件正確地一一對應(yīng)?  好友文國慶建議:用xml文件來定義這種對應(yīng)關(guān)系。這個想法觸動了我:反正就是一個[Key,Value]的數(shù)據(jù),就用已經(jīng)實現(xiàn)的INI配置文件也可以啊。于是所有問題解決!  具體設(shè)計是:語言包配置文件就直接設(shè)置成組件ID與組件顯示信息的Hash表,Key = Value的形式,比如:BTnOK組件的ControlID為“1003”,中文顯示Caption為“登錄”,語言包配置內(nèi)容就是“1003=登錄”。  語言包的加載過程為2步實現(xiàn):  首先,從語言包配置文件中,讀取所有配置的ID、Caption條目到Vector或者Array中。  其次,在遍歷指定窗口中所有組件時,每發(fā)現(xiàn)一個組件,就用其ID在已經(jīng)加載的語言包數(shù)組中查找,找到就用配置的值修改組件Caption屬性;找不到,就認為是不需要動態(tài)配置,不做處理。  配置文件實例:  配置項解釋:Section:[Login Dialog]:界面窗口;等號左邊:窗口中需要設(shè)置其Caption屬性的組件ID;等號左邊:窗口中需要設(shè)置其Caption屬性的組件Caption值;  [Login Dialog]  1001 = 用戶帳號  1002 = 用戶密碼  1017 = 登 錄  1018 = 退 出  語言包配置信息加載代碼:
以下是引用片段:
  BOOL CLanguageManager::loadFromFile()
  ...{
  BOOL bRead=FALSE;
  int i;
  ItemContext temp;
  CStringArray itemBuf,valueBuf;
  bRead = fileManager.GetSectionValues("Main Window",itemBuf,valueBuf);
  if(bRead)
  ...{
  for(i=0;i 
  ...{
  temp.UCtrlID = atoi(itemBuf.GetAt(i));
  temp.strContext = valueBuf.GetAt(i);
  m_vtContexts.push_back(temp);
  }
  }
  itemBuf.RemoveAll();
  valueBuf.RemoveAll();
  bRead = fileManager.GetSectionValues("Login Dialog",itemBuf,valueBuf);
  if(bRead)
  ...{
  for(i=0;i 
  ...{
  temp.uCtrlID = atoi(itemBuf.GetAt(i));
  temp.strContext = valueBuf.GetAt(i);
  m_vtContexts.push_back(temp);
  }
  }
  return bRead;
  }
  讀取語言包配置信息: 
以下是引用片段:
 BOOL CIniFile::GetSectionValues(CString Section, CStringArray &strItemBuf, CStringArray &strValueBuf)
  ...{
  BOOL bRead = FALSE;
  ReadIniFile();//打開文件
  if(bFileExist == FALSE  FileContainer.GetSize() < 0)
  return bRead;//文件打開出錯或文件為空,返回默認值
  int i = 0;
  int iFileLines = FileContainer.GetSize();
  CString strline,str;
  while(i 
  ...{
  strline = FileContainer.GetAt(i++);
  strline.TrimLeft();
  if(strline.GetLength()<=0)
  continue; //跳過空行
  if(strline.Left(2)=="http://")
  continue; //跳過注釋行
  if(strline.GetAt(0)=='[')//查找Section,第一個必須為[
  ...{
  str=strline.Left(strline.Find("]"));//去掉]右邊
  str=str.Right(str.GetLength()-str.Find("[")-1);//去掉[左邊
  str.TrimLeft();
  str.TrimRight();
  if(Section == str)//找到Section
  ...{
  while(i 
  ...{
  strline = FileContainer.GetAt(i++);
  strline.TrimLeft();
  if(strline.GetLength()<=0)
  continue; //跳過空行
  if(strline.GetAt(0)=='[')
  return bRead;//假如到達下一個[],即找不到,返回默認值
  if(strline.Left(2)=="http://")
  continue; //跳過注釋行
  str = strline.Left(strline.Find("="));//去掉=右邊
  str.TrimLeft();
  str.TrimRight();
  //保存等號左邊項
  strItemBuf.Add(str);
  str=strline.Right(strline.GetLength()-strline.Find("=")-1);//去掉=左邊
  str.TrimLeft();
  str.TrimRight();
  //保存等號右邊項
  strValueBuf.Add(str);
  bRead = TRUE;
  }
  //當前Section遍歷結(jié)束
  }
  //沒有找到Section
  }
  //當前行遍歷結(jié)束
  }
  return bRead;
  }
  修改指定組件Caption屬性代碼:
以下是引用片段:
  BOOL CLanguageManager::setControlCaption(CWnd * pCtrl, UINT ctrlID)
  ...{
  BOOL isOK=FALSE;
  for(int i=0;i
  ...{
  isOK = (m_vtContexts[i].uCtrlID==ctrlID);
  if(isOK)
  ...{
  pCtrl->SetWindowText(m_vtContexts[i].strContext);
  break;
  }
  }
  return isOK;
  }
  遍歷設(shè)置指定窗口所有組件Caption屬性代碼:  
以下是引用片段:
  void CLanguageManager::setCaptionForWindow(CWnd * pWnd)
  ...{
  //枚舉對話框中所有組件
  CWnd *pCtrl = pWnd->GetWindow(GW_CHILD);
  while(pCtrl!=NULL)
  ...{
  UINT ctrlID = pCtrl->GetDlgCtrlID();
  setControlCaption(pCtrl,ctrlID);
  pCtrl = pCtrl->GetNextWindow();
  }
  }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成年免费大片黄在线观看岛国 | 免费h片网站| 亚州综合网 | 国产成人在线综合 | 欧美精品一区二区三区久久久 | 久草经典视频 | 沉沦的校花奴性郑依婷c到失禁 | 一级α片免费看刺激高潮视频 | 激情视频在线播放 | 国产精品刺激对白麻豆99 | 99麻豆久久久国产精品免费 | 亚洲免费视频大全 | 一本色道久久综合狠狠躁篇适合什么人看 | 一级毛片真人免费播放视频 | 国产精品午夜未成人免费观看 | 久久综合九色综合久久久精品综合 | 中文字幕 亚洲一区 | 成人性视频欧美一区二区三区 | 日日狠狠久久 | 黄色免费在线网站 | 久草干 | 精品av在线播放 | 欧美成人鲁丝片在线观看 | 色综合狠狠| 亚洲成人在线视频网 | 美女久久久久久久久 | 韩国19禁在线 | 亚州精品在线视频 | 午夜视频大全 | 九草在线 | 国产99页| 一区国产精品 | 成人综合区一区 | 男人午夜小视频 | 欧美成a人片在线观看久 | 欧美一级毛片大片免费播放 | 日本在线看片 | 久久精品国产99久久久古代 | 国产精品一区免费在线观看 | 欧美不卡 | 精品中文视频 |