一、初识DuiEngine的Skin Files
传统MFC界面主要是在一个.rc文件里进行窗口的布局,然后在resource.h中维系一个控件ID通过此控件ID在程序中通过此控件ID就可以访问到该控件,从而对指定控件做出各种操作;DuiEngine与之不同,但是思想仍然类似。以上章我们利用DuiEngineWizard生成的第一个工程为例:
DuiEngine将与界面相关的东西都扔到了一个叫Skin Files的文件夹里,其中:
1.image文件中主要用于存放工程中要使用到的相关图像,这个不要什么多余的讲解;
2.XML最为重要,里面存放两种东西:
<1>界面的布局(顺便提一下与传统界面不同的是DuiEngine布局主要是通过xml文件来实现的)
<2>为界面布局中控件提供样式支持,我暂且称其为样式文件(有点css的感觉但是又不太像,不知道为什么当时作者没有用xml+css做界面布局那),
3.index.xml文件(我暂且称其为资源文件命名表),相当于工程中资源文件的一张命名表。
二、我们需要关心的文件
DuiEngine的作者为我们编写了一个辅助的命令程序residbuilder2.exe来帮助我们构建工程所需的资源id。
由于DuiEngine的工程没有一份很好的说明,所以对于初学者来说很难搞清楚Skin Files中哪些文件需要我们的关心。为此我专门阅读了residbuilder2.exe的源码
以我们的第一节课的建立的工程FirstDuiEngineDemo为例,当我们重新构建项目时仔细观察编译器下方会出现如下命令:
"XXXX\duiengine\tool\residbuilder2.exe" -i "XXXX\duiengine\FirsrtDuiEngineDemo\FirsrtDuiEngineDemo\skin\index.xml" -y –p
skin -r .\duires\winres.rc2 -n .\duires\name2id.xml -h .\duires\winres.h
下面我们就上面这条命令来详细解说各个文件的作用:
First
-i "XXXX\duiengine\FirsrtDuiEngineDemo\FirsrtDuiEngineDemo\skin\index.xml"
命令-i表示读取index.xml,即读取工程中资源文件命名表
<resid type="XML" name="IDR_DUI_INIT" file="xml\init.xml" /> <resid type="XML" name="IDR_DUI_MSGBOX" file="xml\dlg_msgbox.xml" /> <resid type="XML" name="IDR_DUI_MAIN_DIALOG" layer="1" file="xml\dlg_main.xml"/> <resid type="IMGX" name="IDP_MAIN_DLG_FRAME" file="image\dlg_bg_frame.png" /> <resid type="IMGX" name="IDP_BTN_WND_CHECKBOX" file="image\btn_wnd_checkbox.png"/> <resid type="IMGX" name="IDP_BTN_WND_RADIO" file="image\btn_wnd_radio.png" /> <resid type="IMGX" name="IDP_FOCUS_CHECK" file="image\focus_checkbox.png"/> <resid type="IMGX" name="IDP_FOCUS_RADIO" file="image\focus_radio.png" /> <resid type="IMGX" name="IDP_BORDER_EDIT" file="image\img_edit_border.png" /> <resid type="IMGX" name="IDP_BTN_SYS_CLOSE" file="image\btn_sys_close.png" /> <resid type="IMGX" name="IDP_SCROLL" file="image\scrollbar.bmp" />其中主要存放了工程中所要用到的各种类型资源文件命名,DuiEngine支持一下一种资源文件类型定义:
XML:例如我们界面布局文件和样式文件都是XML类型的
ICO:图标资源
BMP:位图资源
IMGX:GDI+图片资源,当然位图也可以使用这种类型
细心的朋友可能看到了,在XML类型中name = IDR_DUI_MAIN_DIALOG后面有一个属性为layer = 1,它的作用我将过会做出说明
Second
-y –p skin
-y表示强制改写标志(说实话我也没搞懂什么意思)
-p表示设置当前路径为skin目录下
Three
-r .\duires\winres.rc2
表示将index.xml文件中的内容格式化到资源文件winres.rc2文件中
DEFINE_XML(IDR_DUI_INIT, "skin\\xml\\init.xml") DEFINE_XML(IDR_DUI_MSGBOX, "skin\\xml\\dlg_msgbox.xml") DEFINE_XML(IDR_DUI_MAIN_DIALOG, "skin\\xml\\dlg_main.xml") DEFINE_IMGX(IDP_MAIN_DLG_FRAME, "skin\\image\\dlg_bg_frame.png") DEFINE_IMGX(IDP_BTN_WND_CHECKBOX, "skin\\image\\btn_wnd_checkbox.png") DEFINE_IMGX(IDP_BTN_WND_RADIO, "skin\\image\\btn_wnd_radio.png") DEFINE_IMGX(IDP_FOCUS_CHECK, "skin\\image\\focus_checkbox.png") DEFINE_IMGX(IDP_FOCUS_RADIO, "skin\\image\\focus_radio.png") DEFINE_IMGX(IDP_BORDER_EDIT, "skin\\image\\img_edit_border.png") DEFINE_IMGX(IDP_BTN_SYS_CLOSE, "skin\\image\\btn_sys_close.png") DEFINE_IMGX(IDP_SCROLL, "skin\\image\\scrollbar.bmp")Four
-n .\duires\name2id.xml
表示将index.xml中XML资源中(布局文件XML)且属性中带有layer = ‘‘1"中的控件name转化为相应id存放到当前文件中,我们还记得在index.xml中为IDR_DUI_MAIN_DIALOG设置了layer="1"
所以这里将根据dlg_main.xml中控件的name属性生成其id对照存放到name2id.xml文件中
生成的name2id.xml内容如下:
<name2id name="DUI-DEMO" id="65536" /> <name2id name="maindlg" id="65537" /> <name2id name="btn_close" id="1" /> <name2id name="btn_msgbox" id="65538" />Five
-h .\duires\winres.h
只有在生成项目时选择了“支持ID系统”才会出现此命令。
其内容与name2id.xml是一致的,只是采用#define宏定义格式
/*<------------------------------------------------------------------------------------------------->*/ /*该文件由residbuilder2生成,请不要手动修改*/ /*<------------------------------------------------------------------------------------------------->*/ #define DUI-DEMO 65536 #define maindlg 65537 #define btn_close 1 #define btn_msgbox 65538
第二章 DuiEngine资源文件介绍