最近做了一个驱动程序属性页插件的八国联军语言支持,搞得比较纠结,总共要支持英(美)、法、日、德、意、俄、葡、西、简中和繁中,算了算除了葡、西,竟然都在联军之列,百多年前折磨慈禧老太太,百多年后还来折磨老子,看来中国还得自强,到那时候我们就不用支持别人的语言了,全世界都学中文喽,哈哈。
言归正传,在此记录一下试验经过,以备今后做个参考。
尝试一:
因为历史原因,这个驱动的属性页程序是个ANSI的程序,根本就不支持UNICODE的编译,于是我就想把项目修改为UNICODE项目,因为既然要支持中文,程序肯定需要支持这个的,这是我最初的判断。在网上搜索了一些东西,看了别人的做法,自己实现如下:
1、在VC Project->Settings->C/C++的Preprocessor Definitions框里添加UNICODE的定义
2、把所有的字符串变量都改成TCHAR类型,并在字符串前加_T()标志
结果,提示我链接错误,可能是链接的库不是UNICODE的,于是我又把DirectShow里的UNICODE库也添加到项目的lib寻找目录,但是链接还是不过。此路不通,或者我没改好。不知道,时间不多我需要找其它的方法。
尝试二:
使用多资源,VC里面的资源本来就支持多语言,我把原来的English US资源进行拷贝,然后重新命名ID,并把Dialog里的控件标题都改成相应语言的字符,下面是我改成中文简体的步骤:
1、拷贝
2、选择资源语言
3、修改控件的标题
4、修改初始化函数,把相应的ID传给基类
使用GetThreadLocale()函数检查当前系统语言,根据不同的系统语言把相应的资源ID传给基类,基类在初始化的时候会使用这个资源去创建Dialog界面。
自定义类构造函数:
CProxyPluginPage::CProxyPluginPage( LPUNKNOWN piOuterUnknown, int DialogID, int TitleID ) :
CBasePropertyPage(
T_CAMINFTC_PROPPAGE_TEXT,
piOuterUnknown,
DialogID,
TitleID),
m_piConfig( NULL ),
m_lRate( 0 ),
m_bActive( FALSE )
{
}
类的实例化:
CProxyPluginPage* pPropertyPage = new CProxyPluginPage( piOuterUnknown, DlgId, TitlId );
自此,驱动程序的属性页插件的多语言界面就可以支持了。
另外还有一个属性页的标题,即TitleId代表的资源,它是VC里的String table的东西,按照上述方法也依次进行拷贝。但是不知道为什么在里面新建的string的ID号VC不会更新,因此手动需要修改ID号,否则界面不会显示相应的title的。修改方法很简单,直接打开resources.h文件,找到那个ID,手动修改一个未被定义的数字即可。在save的时候VC会提示一个警告,忽略它。修改完后记得一定要rebuild all来编译。
尝试三:
直接在代码里定义TCHAR数组,用相应的语言字符串初始化之,然后根据不同的系统语言来初始化static控件标题。
这种方法是可行的,但是是有条件的:
1、相应的语言字符串必须在系统语言也是这个语言的时候做拷贝
2、拷贝完之后不能在这个语言环境下编译,必须把语言切换为English US下全部编译,因为在编译的时候有些语言会把其它语言的字符搞乱,但是English环境下是不会的。
3、编译完之后还要切换到相应语言环境下进行测试。