快速入门系列零:玛德界面库的来由、窗口、皮肤、项目管理等基本概念
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逻辑”的概念,并且支持多个窗口,也就产生了一个副产品,必须有个管理者来管理这些窗口以便组合成一个完整的项目。于是就有了“项目管理配置文件”的产生,一个典型的文件格式是如下的样子:
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。
在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。
相关文章推荐
- 快速入门系列--CLR--01基本概念
- 快速入门系列--CLR--01基本概念
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- [项目管理入门系列] 师傅领进门-------项目运作的一般流程(二)
- 项目管理整体的一些基本概念1
- Oracle GoldenGate快速入门教程:基本概念和配置
- C++ Primer学习系列(1):快速入门/变量和基本类型/标准库类型
- [项目管理入门系列] 师傅领进门-------项目运作的一般流程(三)
- Windows Server入门系列27 利用字符界面管理用户和组
- php快速入门基本概念
- WPF快速入门系列(9)——WPF任务管理工具实现
- C++ Primer学习系列(1):快速入门/变量和基本类型/标准库类型
- Flex快速入门系列之二:FlashBuilder创建项目以及远程JAVA对象访问(包括spring)篇
- Oracle GoldenGate快速入门教程:基本概念和配置
- SubVersion基本概念与快速流程,做大项目必备
- Subversion快速入门教程,软件下载,服务器和客服端安装,导入项目,基本客服端操作
- linux shell编程五步拳(张迅雷闪击shell系列) 第一集 shell基本语法快速入门
- linux shell编程五步拳(张迅雷闪击shell系列) 第二集 shell编程基本语法快速入门
- 快速入门系列--TSQL-01基础概念
- 第一章 项目时间管理的基本概念