BCGControlBar Pro是优秀的MFC的一个扩展类库,可以用来构建类似于Microsoft Office、Microsoft Visual Studio和其他一些知名产品的高级用户界面。可是创建应用程序的向导仅提供支持英语语言的资源,不能产生中文资源菜单的应用程序。好在安装BCGControlBar Pro 7.31后有制作创建应用程序向导的工程文件,可以以此为基础制作支持中文语言、英语语言资源的创建工程向导。经过两天的摸索,已解决了制作创建工程向导中的问题,将整个制作向导的过程作一完整的叙述,以能完整的再现解决问题的过程。
一、BCGControlBar Pro 7.31支持中文资源创建应用程序向导制作的已有资料及存在问题
网上有BCGControlBar7.3.1中文向导制作文章,该文的方法如下:
1、将SetSupportedLanguages(_T(English[UnitedStates](APPWZENU.DLL);
0x40904b0/nDeutsch[Deutschland](APPWZDEU.DLL);0x40704b0 "))语句修改为SetSupportedLanguages(_T( "中文 [中国](APPWZEDU.DLL);0x80404b0 "));
2、汉化资源文件及其它资源。在工程BCGPAppWizard的Template文件夹下,找到DlgLoc_enu.rc和Loc_enu.rc文件文件,用文本编辑器将其打开,将其中的英文字符改为相应的中文,编辑完毕后保存即可,将在其他文件(如Root.cpp等)中出现的英文文本显示的字符翻译成中文。
3、消除库的开发者在应用向导自定义的第一页中添加了一个“无用”控件,其ID为IDC_MDI_TAB_GROUPS,与之相关的变量名为BOOL m_bMDITabGroups。工程中与IDC_MDI_TAB_GROUPS及m_bMDITabGroups相关的行注释掉(文中对OnMdiTabs()中的IDC_MDI_TAB_GROUPS更改为IDC_MDI_TAB)。
采用该文的方法确实可以制作支持中文资源的工程创建向导,但没有资源语言的选择余地,同时,在SetSupportedLanguages中使用APPWZEDU.DLL,而非使用APPWZCHS.DLL,仅把转换标识符改为中文的0x80404b0,其实只要按该文进行第2、3步就可以了,原因是第2步已对使用的所有资源文件进行了汉化。该作者这样处理后,将失掉原有的一些功能,原因是作者认为开发者在应用向导自定义的第一页对话框中添加了一个“无用”控件,其ID为IDC_MDI_TAB_GROUPS。其实,不是多了一个“无用”控件,而正是缺失了一个与IDC_MDI_TAB_GROUPS相关联的选择框控件,向导使用与该选择框控件相关联的m_bMDITabGroups成员变量来控制MDI文档TAB标签是否分组。
二、制作BCGControlBar Pro 7.31支持多语言资源创建工程向导的方法及解决问题的过程
有没有制作既支持英语又支持中文资源的BCGControlBar Pro 7.31创建工程向导的可能?经历了以下过程,最终解决了问题。
首先是在向导自定义的第一页对话框中添加一个“Check Box”的控件,选择标识符为IDC_MDI_TAB_GROUPS。否则在用向导创建工程进入向导自定义的第一页对话框时将会弹出“试图执行系统不支持的操作”错误对话框,创建工程向导不能向下进行。
(一)、仅在语言支持中增加中文语言支持,而不汉化BCGPAppWizard的Template文件夹下下的任何资源文件。
1、安装BCGControlBarPro后的目录下有向导工程BCGPAppWizard,用VC打开BCGCBProAppWizard.dsw,浏览BCGBAppWizardaw.cpp文件,在InitCustomAppWiz()函数找到SetSupportedLanguages(_T( "English [United States] (APPWZENU.DLL);0x40904b0 ")),把该语句修改为 SetSupportedLanguages(_T( "中文[中国] (APPWZCHS.DLL);0x80404b0\n英语[美国] (APPWZENU.DLL);0x40904b0 "));,重新编译形成创建工程向导的awx文件。
2、用该创建工程向导创建一新工程,选用中文语言。编译后执行,debug版会弹出一错误对话框,选择“忽略”,程序可继续执行,程序菜单已为中文,但为MFC标准资源菜单,无BCGControlBar Pro 7.31扩充菜单,同时,按“关于”菜单会弹出“试图执行系统不支持的操作”错误对话框。对于Release版唯一不同是开始不会出现错误对话框,其余与debug相同。
3、用该创建工程向导再创建一新工程,选用英文语言。编译后执行,一切正常,具有英文菜单,并有BCGControlBar Pro 7.31扩充菜单。
(二)、自己用“custom AppWizad”创建一定制向导工程。在选择支持语言时,选择所有语言。
用文本编辑器打开该工程目录下的资源文件(.rc,),在TEMPLATE节,对应每一语言均有以下文件组:
LOC_xxx.RC TEMPLATE DISCARDABLE "template\\loc_xxx.rc "
DLGLOC_xxx.RC TEMPLATE DISCARDABLE "template\\dlgloc_xxx.rc "
DOC_xxx.ICO TEMPLATE DISCARDABLE "template\\doc_xxx.ico "
ROOT_xxx.CNT TEMPLATE DISCARDABLE "template\\root_xxx.cnt "
ROOT_xxx.HPJ TEMPLATE DISCARDABLE "template\\root_xxx.hpj "
AFXDLG_xxx.RTF TEMPLATE DISCARDABLE "template\\afxdlg_xxx.rtf "
AFXCORE_xxx.RTF TEMPLATE DISCARDABLE "template\\afxcore_xxx.rtf "
AFXPRINT_xxx.RTF TEMPLATE DISCARDABLE "template\\afxprint_xxx.rtf "
AFXOLECL_xxx.RTF TEMPLATE DISCARDABLE "template\\afxolecl_xxx.rtf "
AFXOLESV_xxx.RTF TEMPLATE DISCARDABLE "template\\afxolesv_xxx.rtf "
AFXDB_xxx.RTF TEMPLATE DISCARDABLE "template\\afxdb_xxx.rtf "
SCMENU_xxx.BMP TEMPLATE DISCARDABLE "template\\scmenu_xxx.bmp "
APPEXIT_xxx.BMP TEMPLATE DISCARDABLE "template\\appexit_xxx.bmp "
HLPSBAR_xxx.BMP TEMPLATE DISCARDABLE "template\\hlpsbar_xxx.bmp "
XXX为语言标识符,chs-中文、enu-英语、……。
并列出了在子目录TEMPLATE中的文件名称,子目录TEMPLATE下每一语言也有对应的一组文件。
再用文本编辑器打开BCGPAppWizard\BCGCBProAppWizard.rc,在TEMPLATE节,只有英语语言对应的一组文件。而该工程对应的子目录TEMPLATE下也只有英语语言对应的一组文件。
经过以上过程,根据在(一)中制作的awx用来创建支持中文资源的程序会出错,而创建英语资源的程序一切正常,可以判断原因是与无中文资源相关的文件组有关。至此,基本找到了解决的方法。
(三)、制作BCGControlBar Pro 7.31支持多语言资源创建工程向导的方法
使用工具:文件比较器,使用UltraCompare。
1、经比较自己用“custom AppWizad”创建定制向导工程的LOC_chs.rc、DLGLOC_chs.rc和LOC_enu.rc、DLGLOC_enu.rc,中文资源文件是英语资源文件一对一的翻译。因此,可用自己用“custom AppWizad”创建定制向导工程的LOC_chs.rc、DLGLOC_chs.rc作为BCGControlBar Pro 7.31创建工程向导TEMPLATE的中文资源文件的基础,将其复制到BCGPAppWizard\Template目录。
2、使用UltraCompare同时打开3个文件的文本比较模式,将“custom AppWizad”创建定制向导工程的LOC_enu.rc作为第一打开文件,将BCGPAppWizard\Template目录下的LOC_enu.rc作为第二打开文件,将BCGPAppWizard\Template目录下的LOC_chs.rc作为第三打开文件,比较三个文件,第二文件有的而第一文件无的部分资源是BCGControlBar Pro 7.31特有的资源,将该部分特有资源插入第三个中文资源文件相应位置,至此大部分为中文的资源文件已形成,需翻译的只是BCGControlBar Pro 7.31特有部分资源,对另一资源文件作相应处理(其实对于DLGLOC_chs.rc仅是增加了几行注释而已),所需中文资源文件已形成。
3、用文本编辑器打开BCGPAppWizard\BCGCBProAppWizard.rc,在TEMPLATE节增加支持中文资源的一组文件列表,即(二)中的一组文件。同时在BCGPAppWizard\Template目录下增加该组中除两个rc资源文件外的其它文件、可采用复制BCGPAppWizard\Template目录下对应的英语语言文件组,将_enu改为_chs。
4、重新编译,经创建程序证实功能一切正常。
把编译生成的BCGCBProAppWizard.awx文件拷贝到C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template目录下即可。
从这一过程可看出,工程向导创建程序框架时,根据使用的语言在BCGCBProAppWizard.awx中查找对应的语言标识符对应的资源,如果BCGCBProAppWizard.awx中无对应的资源,就使用MFC中相应语言的标准资源。了解了查找资源的次序,再来制作支持多语言的创建工程向导就容易了。本文虽是针对BCGControlBar Pro,对其它创建工程向导增加语言支持的制作也可采用以上4个步骤实践。