您的位置:首页 > 其它

快速入门系列零:玛德界面库的来由、窗口、皮肤、项目管理等基本概念

2015-01-13 15:03 519 查看
一段时间以来,科学家们都在研究DirectUI相关的界面技术。作者本人在2012年接触了这个神器的技术,发现比之MFC做界面,简直就是嫦娥和猪八戒的区别啊。之后找到了DuiLib为代表的国内作品,感谢DuiLib的开发者开源,于是我开始拜读DuiLib的源码。

在LongLongAgo之前,作者是设计了一个在MFC基础控件上重绘的界面库代码的。其原理就是通过Xml来表述控件界面行为,然后按照Xml的约束来对控件进行重绘。接触了DuiLib之后,在惊叹DirectUI设计思想的先进的同时,也对官方DuiLib的代码的结构产生了很多自己的想法,于是开始大刀阔斧的重构。

1. 替换了Xml解释部分,换成了作者自己设计的Xml语法解释器,主要是为了自动适应Xml文件的内码格式;

2. 重构了DuiLib底层解释UI属性的代码,主要是为了更好的扩充UI属性,也为了统一解释接口等;

3. 增加了一个Notify消息delegate模式,这样UI的NotifyEvent可以直接调用到相应的回调函数里,当然消息处理函数可以是全局函数或者类成员函数;增加Windows消息的delegate模式,当然消息处理函数可以是全局函数或者类成员函数;

4. 增加了Lua脚本支持,把UI的API接口导出到了Lua,每个窗口都引入了若干Lua脚本,这样可以在Lua内写UI的Notify事件处理了,这个框架的开发流程更简洁了;

5. 重构WS_EX_LAYERED风格的窗口的绘制以及由此引起的一系列问题(我们有理由怀疑,这个坑仍然没有填完。可喜的是在作者的异形半透明项目中没有再发现问题);

6. 重构窗口绘制和消息处理,这是为了真正能创建若干个Window,以后再也不用把所有界面都堆积(通过include引入的xml文件也算这种类型)到一个Xml内了,为此引入了“窗口皮肤”的概念。也就是一个Window对应一套皮肤,其中包含一个皮肤UI的描述文件“*.xml”,一个静态建立跟Lua交互的文件“*.Reg.Xml”,若干个Lua脚本文件“*.lua”;

7. 增加了几个UI:一个使用MFC思想设计的TabPage属性页(TabCtrlLayout和TabPageUI),一个可以包含独立Window的WindowOwnerUI,一个新的TreeViewUI和TreeNodeUI,一个支持Edit的ComboBoxUI,其他对DuiLib里原有UI的功能扩充等;这些都会在以后的“快速入门系列”文章里做介绍;

8. 重构菜单相关功能,把菜单修改成可以使用“窗口皮肤”的模式,也就是可以任意设计菜单了,不在拘泥于MenuUI和MenuElementUI,而且也更容易的创建;

9. 增加了Gif动画支持,自己写了个解释Gif图片格式的功能,然后可以在任何使用image的地方把静态图片设置成gif图片了;配合“异形半透明”窗口甚至可以做一个动态背景的异形窗口;

10. 使用玛德界面库写了个玛德界面的编辑器,并且实现用“玛德界面编辑器”来开发“玛德界面编辑器”自己;

11. 增加了动态扩充UI的接口:可以通过自定义UI的方式来替换系统提供的UI,也可以自己设计新的UI。使用方法也很简单,只需要把编译出来的dll文件改名为(*.3K)并放到特定目录下,就可以了。这个也会在后续的“快速入门”系列文章里做详细介绍。

因为引入了“窗口皮肤+Lua逻辑”的概念,并且支持多个窗口,也就产生了一个副产品,必须有个管理者来管理这些窗口以便组合成一个完整的项目。于是就有了“项目管理配置文件”的产生,一个典型的文件格式是如下的样子:

<?xmlversion = "1.0" encoding = "UTF-8" standalone = "yes" ?>
<DuiSkin.Config name="WorkDir">
<SkinResType>DISK_DIR</SkinResType>
<ResName>WorkDir</ResName>
<ResPath>WorkDir</ResPath>
<ResID>1</ResID>
<MainSkin>ColorBox</MainSkin>
<LuaFile>UpdateTools.lua</LuaFile>
<SkinDataList>5
<SkinData nLoadNow="0" nMultiplex="0" tip="">ColorBox
<ClassName></ClassName>
<luaWndName>luaWnd_ColorBox</luaWndName>
<SkinXmlFile>ColorBox.Xml</SkinXmlFile>
<LuaRegFile>ColorBox.Reg.Xml</LuaRegFile>
<LuaFile>ColorBox.Lua</LuaFile>
</SkinData>
<SkinData nLoadNow="1" nMultiplex="0" tip="颜色配置">Config_Color
<ClassName>CDlgDefault</ClassName>
<luaWndName>luaWnd_Config_Color</luaWndName>
<SkinXmlFile>Config_Color.Xml</SkinXmlFile>
<LuaRegFile>Config_Color.Reg.Xml</LuaRegFile>
<LuaFile>Config_Color.Lua</LuaFile>
</SkinData>
<SkinData nLoadNow="0" nMultiplex="0" tip="3主窗口">UpdateTool3
<ClassName>CUpdateToolsDlg</ClassName>
<luaWndName>lua_wnd_UpdateTool</luaWndName>
<SkinXmlFile>UpdateTools.xml</SkinXmlFile>
<LuaRegFile>UpdateTool3.Reg.Xml</LuaRegFile>
<LuaFile>UpdateTool3.Lua</LuaFile>
<LuaFile>UpdateTool3.Lua</LuaFile>
<LuaFile>UpdateTool3.Lua</LuaFile>
</SkinData>
<SkinData nLoadNow="0" nMultiplex="0" tip="5窗口">UpdateTool5
<ClassName>CUpdateToolsDlg</ClassName>
<luaWndName>lua_wnd_UpdateTool</luaWndName>
<SkinXmlFile>UpdateTools.xml</SkinXmlFile>
<LuaRegFile>UpdateTool5.Reg.Xml</LuaRegFile>
<LuaFile>UpdateTool5.Lua</LuaFile>
</SkinData>
<SkinData nLoadNow="1" nMultiplex="0" tip="主窗口">UpdateTools
<ClassName>CUpdateToolsDlg</ClassName>
<luaWndName>lua_wnd_UpdateTool</luaWndName>
<SkinXmlFile>UpdateTools.Xml</SkinXmlFile>
<LuaRegFile>UpdateTools.Reg.Xml</LuaRegFile>
<LuaFile>UpdateTools.Lua</LuaFile>
</SkinData>
</SkinDataList>
</DuiSkin.Config>
项目管理配置文件内各字段的说明如下:

1. SkinResType字段:标识资源类型,有四个可取的值

ZIP_DISK:放在硬盘上的ZIP打包资源;

ZIP_DLL: 放在Exe/Dll内编译后的ZIP打包资源;

DISK_DIR:放在硬盘上的散文件资源,由一个目录统领;

FILE_DLL:放在Exe/Dll内编译后的资源,该方法使用极端复杂,不推荐。

2. ResName、ResID字段:在SkinResType == ZIP_DLL时使用,用来标识编译资源的类型和ID值;

3. ResPath字段:在SkinResType == ZIP_DISK时是ZIP包的名字;在SkinResType
== DISK_DIR时,是“资源统领”文件夹的名字;

4. MainSkin字段:项目主皮肤的名称;

5. LuaFile字段: 可以有多个,每一个都是项目公用的Lua脚本文件名称,一些全局的Lua函数可以写在这里;

6. SkinDataList字段:这个就是项目所有皮肤的列表;

7. SkinData字段:一套“窗口皮肤”的所有信息都在这里;值就是皮肤“标识名”,该名字必须唯一,既是项目逻辑内区分皮肤的标识,也是Lua系统中的Lua命名空间的名称;

A. nLoadNow:是否立即加载皮肤信息,该参数无意义,底层统一修改为第一次使用时加载;

B. nMultiplex:皮肤是否可重用,如果该皮肤会同时创建若干个相同的Window,则该参数必须为1,否则为0;为1的时候,别的Window的Lua文件将不能再掉用这套皮肤的Lua函数;

C. tip:一个说明字段,是个开发人员对皮肤的说明注释;

D. ClassName:该皮肤使用的C++窗口类标识。项目内需要根据这个值来生成不同的Window窗口,理论上可以使任意的字符串,但实际上一般使用窗口类名(窗口类必须是MDuiLibWindow的派生类的类名字);如果为空,由项目逻辑确定使用的缺省C++类;

E. luaWndName:窗口导出到Lua系统中的变量名,可以在本皮肤的Lua逻辑文件内自由使用;如果0 ==nMultiplex,那么在别的窗口的Lua逻辑文件内可以使用类似“SkinName.luaWnd_Test.FuncTest()”这样的语法调用该皮肤的C++类导出的Lua接口函数(作者不推荐这种用法);

F. SkinXmlFile:皮肤UI配置文件,如果为空,则默认使用的是“皮肤名.Xml”;

G. LuaRegFile:Lua静态注册Notify消息和UI的Lua变量名的“勾连”文件,如果为空,则默认使用的是“皮肤名.Reg.Xml”;

H. LuaFile:Lua逻辑文件名,可以有多个;如果为空,则默认使用的是“皮肤名.Lua”;

I:上面说的这些都可以通过“玛德界面编辑器”里的“项目管理”功能来可视化的编辑,而不用“手写”。

以上就是玛德界面库(MDui)的项目管理功能以及基本功能简介,如果有谬误,请联系作者(89702120@qq.com)或者给我CSDN留言。

广告时间:玛德界面库,满足你的各种想象,帮你实现程序界面的各种野望。

下载地址:网页

玛德界面库:“http://code.taobao.org/p/mduiproject/src/”;

玛德界面编辑器:“http://code.taobao.org/p/mduidesigner/src/”;

下载地址:SVN

玛德界面库:“http://code.taobao.org/p/mduiproject/src/”;

玛德界面编辑器:“http://code.taobao.org/p/mduidesigner/src/”;

联系方式:MDui玛德界面官方交流QQ群 371989312。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: