游子的博客
慈母手中线,游子身上衣, 临行密密缝,意恐迟迟归, 谁言寸草心,报得三春晖。 数据读取中,请稍候......
posts - 337,  comments - 546,  trackbacks - 0

通过ini实现多语言菜单

       下载本文的演示及源代码(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<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);

   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的文字(就是在状态栏上显示的提示)

这个不足我还没有着手解决,希望能解决的也给我些提示   111222@0451.com

posted on 2009-02-04 18:24 游子 阅读(1505) 评论(1)  编辑 收藏 引用 所属分类: 软件

FeedBack:
# re: 多语言菜单(转)----VC,INI实现
2009-02-12 21:43 | 游子
在WINDOWS平台上开发多语言界面一般有三种方法。

1. 为每种语言发布单独的版本(如Microsoft Windows)

2. 包括不只一种语言资源的可执行文件,或者独立的DLL文件。(如IsoBuster)这也是我们使用最多的方法。

3. 外部语言包的可执行文件。象Netants, FlashGet, Tweak-XP, PatchWise Free等等软件在支持多语言时已经越来越多的使用外部语言包(*.ini或者*.lng)来替代DLL文件。由于语言包可以动态地修改,所以软件的重新编译就没有必要了。而且,这很容易改变语言和保持外部语言包的独立性。

在这里,我们来看一看第三种方法。因为它是最容易,最简单的解决方法。

1。第一步是最重要的。你必须在你的工程里面添加文件LangIni.h和LangIni.cpp。

2.然后,在你的C****App类中添加变量。

3.在你的C****Dlg:: ()函数中,初始化你的按钮/文本。添加下列代码:

void C****Dlg:: OnInitDialog (void)
{
SetDlgItemText(IDOK,
theApp.m_langINI.GetValue("Button",
"OK"));
SetDlgItemText(IDCANCEL,
theApp.m_langINI.GetValue("Button",
"Cancel"));
SetDlgItemText(IDC_PROMPT,
theApp.m_langINI.GetValue("Prompt",
"Prompt"));
SetDlgItemText(IDC_PROMPT_ENGLISH,
theApp.m_langINI.GetValue("Prompt",
"Lang1"));
SetDlgItemText(IDC_PROMPT_CHINESE,
theApp.m_langINI.GetValue("Prompt",
"Lang2"));
}
4.然后,为单选按钮的ON_BN_CLICKED事件添加句柄:
void CUILangDlg::OnBnClickedPromptEnglish()
{
// TODO: Add your control notification handler
// code here
theApp.m_langINI.LoadFile("english.ini");
InitControls();
}

void CUILangDlg::OnBnClickedPromptChinese()
{
// TODO: Add your control notification handler
//code here
theApp.m_langINI.LoadFile("chinese.ini");
InitControls();
}
这就完成了基本的工作。那么。INI中的文件到底要包括哪些内容呢?

在INI文件中,你只需根据你的菜单需要输入要改变的内容即可。如在示例中,程序需要从BUTTON中取值,那我们就在BUTTON一项中输入内容即可。示例中的CHINESE.INI文件内容如下:

[Button]

OK=确定

Cancel=取消



[Prompt]

Prompt=选择语言

Lang1=英语

Lang2=中文

这只是一个对话框的例子。对一个软件来说的话,INI文件也不会很复杂。你需要在记事本文件中输入相应菜单即可。一般一个应用程序包含有菜单,和标题,状态栏等。那就需要象下面一样:

[Application]

Title=示例



[Dialog] ;对话框

About Title=关于示例

Lang Title=选择语言

Lang Prompt=请选择语言

OK=确定

Cancel=取消



[File Menu]

1000=&File

1001=&New ;改变后菜单上的内容

……

1001=”打开文件%New” ;改变语言后状态栏的内容,%New表示映射工具条

……

怎样,是不是比较简单。而且这种方法已经被越来越多的软件所采用,我们也不妨试试看!  回复  更多评论
  
只有注册用户登录后才能发表评论。

欢迎大家扔鸡蛋!送鲜花!

博客可以收入过千吗?

<2006年4月>
日一二三四五六2627282930311234567
89101112131415161718192021222324252627282930123456

常用链接

留言簿(8)

随笔分类(314)

随笔档案(337)

文章分类(7)

文章档案(10)

相册

收藏夹(1)

其它

友情链接

数字电视

生活、旅游

自己的链接

计算机

搜索

  •  

积分与排名

  • 积分 - 403600
  • 排名 - 9

最新评论

阅读排行榜

评论排行榜