新设想——VC开发多语言界面支持的新招

新设想——VC开发多语言界面支持的新招,第1张

新设想——VC开发多语言界面支持的新招,第2张

最近在做一个小程序,需要多语言界面显示的支持功能,用户可以自己设置界面显示内容。

最初是用INI文件来配置显示内容,通过改变另一种语言的配置文件就可以改变整个系统的显示语言。考虑到系统规模小,周期短,我不想用太复杂的方案来解决这个问题。我在网上查阅了很多类似的设计和代码,发现并不是很满意。

主要问题是,基于INI文件配置这种简单且适当的实现的绝大多数代码都是为组件ID加载的,组件的ID号被写死了。例如,下面是一段引文:

strCaption = fileManager。GetString(section," IDC_Stc_ListStudent "," ");

SetDlgItemText(IDC _ Stc _ list student,str caption);

strCaption = fileManager。GetString(section," IDC_Stc_AllContent "," ");

SetDlgItemText(IDC _ Stc _ all content,str caption);

这样,接口组件越多,加载代码越长;对于每一个新的显示窗口,都要复制粘贴相似的代码,还要根据组件ID的常量值修改相关的附加组件,非常不愉快!

设想是:为窗口组件的标题设计一个统一通用的设置方法,在一个给定的框架或对话框等窗口容器组件中遍历所有组件,这样增减显示组件都不会影响语言包加载代码,可以达到自适应界面组件的语言包加载效果。

这就产生了一个新问题:语言包配置文件中的标题值如何正确对应相关组件?

我的朋友温国庆建议用XML文件来定义这种对应关系。这个想法触动了我:反正只是一个[Key,Value]数据,用已经实现的INI配置文件就可以了。所以一切问题都解决了!

具体设计是:语言包配置文件直接设置为组件ID和组件显示信息的哈希表,Key = Value。比如BtnOK组件的ControlID为“1003”,中文显示标题为“登录”,语言包配置内容为“1003=登录”。

语言包的加载过程分两步实施:

首先,从语言包配置文件中,将所有配置的ID和标题条目读入Vector或Array。

其次,遍历指定窗口中的所有组件时,每找到一个组件,就用其ID在加载的语言包数组中搜索,找到时用配置的值修改组件标题属性;如果找不到,则认为不需要动态配置和处理。

配置文件示例:

物品说明:版块:[登录对话框]:界面窗口;左边:窗口中需要设置标题属性的组件的ID;左边:窗口中需要设置标题属性的组件的标题值;

[登录对话框]

1001 =用户帐户

1002 =用户密码

1017 =已记录

1018 =退出

语言包信息加载代码:

以下是引号片段:
Bool clanguage manager::load from file()
...{
Bool Bread = false;
int I;
item context temp;
CStringArray itemBuf,valueBuf
bRead = fileManager。GetSectionValues("主窗口",itemBuf,value buf);
if(面包)
...{
for(I = 0;我
...{
temp . uctr lid = atoi(item buf。GetAt(I));
temp.strContext = valueBuf。GetAt(I);
m _ vt contexts . push _ back(temp);
}
}
itemBuf。remove all();
valueBuf。remove all();
bRead = fileManager。GetSectionValues("登录对话框",itemBuf,value buf);
if(面包)
...{
for(I = 0;我
...{
temp . UC trlid = atoi(item buf。GetAt(I));
temp.strContext = valueBuf。GetAt(I);
m _ vt contexts . push _ back(temp);
}
}
退面包;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 新设想——VC开发多语言界面支持的新招

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情