迅雷在线文档中:

HelloBolt2:创建窗口和对象树

HelloBolt2在HelloBolt1的基础之上,创建窗口,并在窗口中贴出一张半透明的底图,效果如下所示:
                    
         从效果图中可以看到,窗口有着透明的圆角,而且透过窗口可以看到之下的桌面。接触过windows开发的人都应该知道,这样一个半透明的界面,用传统的windows开发实现起来是很不容易的。让我们进入Bolt的教程,来看看如何用Bolt简单搞定。
        
在HelloBolt.cpp中的工作与HelloBolt1中基本相同,唯一不同的是指定加载名为HelloBolt2的XAR包。
Bolt对界面交互的解构是将界面抽象为树结构(UIObjectTree),将界面上的各种元素(贴图,文字等)抽象为界面对象(UIObject),将UIObject加入到UIObjectTree上的不同层次(zorder)和不同位置之上组成界面。同时,UIObjectTree需要一个容器窗口(HostWnd)让操作系统将各种输入事件发给UIObjectTree处理,并能把UIObjectTree渲染生成的界面显示展示到屏幕上。所以,用Bolt创建界面的主干就是创建UIObjectTree和与之广联的HostWnd。
如果完全以编程的方式,创建空UIObjectTree,创建各种UIObject,再通过接口往UIObjTree中加入UIObject,这样的做法不够直观,而且枯燥复杂,开发效率低,且不易维护。为了更加高效,直观的组织UIObjectTree ,Bolt提供了模板(Template)机制,在布局xml文件中,以树状结构组织的特定xml节点来定义对象树模板(ObjectTree Template)。
模板(Template)机制是支持界面布局的基础,所谓模板,就是以xml格式静态定义Bolt各类对象(包括UIObjectTree, HostWnd, UIObject, Animation)的属性。之后再从模板创建对象实例,那么对象实例的属性值就已经被预定义,不需要通过编程方式设置。比如定义一个对象树模板(ObjectTree Template),并在模板定义中加入若干指定了层次(zorder)和位置的UIObject, 那么从该模板上创建出的UIObjectTree实例就如模板定义已经含有被布局好的UIObject.
在HelloBolt2 XAR包中加入layout目录,在该目录下加入布局xml。MainWnd.xml中定义对象树模板和容器窗口模板(HostWnd Template),xml节点如下:
<objtreetemplate id="HelloBolt.Tree" class="ObjectTreeTemplate">
     <hostwndtemplate id="HelloBolt.Wnd" class="FrameHostWnd">
在HelloBolt2的入口脚本onload.lua中,需要从模板创建UIObjectTree和HostWnd并关联之, 这样当HelloBolt2被Bolt加载时,就会打开一个窗口并展示内容了。
转到onload.lua中的代码:
local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")

这行,XLGetObject接口获取通过XLLuaRuntime的XLLRT_RegisterGlobalObj接口以特定id注册到Bolt运行环境中的全局对象,Bolt内置的核心对象都可以在lua脚本中通过调用XLGetObject来获取,id为"Xunlei.UIEngine.TemplateManager"的对象是模板管理器对象,在布局xml中定义的各种模板都可以通过模板管理器的GetTemplate()接口来获取(模板指南)。

local frameHostWndTemplate = templateMananger:GetTemplate("HelloBolt.Wnd","HostWndTemplate")

local frameHostWnd = frameHostWndTemplate:CreateInstance("MainFrame")

以上两行,调用模板管理器的GetTemplate()方法获取模板对象,然后通过模板的CreateInstance方法以创建该模板的实例对象。这样就通过MainWnd.xml布局中定义的容器窗口模板创建了HostWnd对象。

local objectTreeTemplate = templateMananger:GetTemplate("HelloBolt.Tree","ObjectTreeTemplate")

         local uiObjectTree = objectTreeTemplate:CreateInstance("MainObjectTree")

同样,以上两行从模板上创建了UIObjectTree对象。

frameHostWnd:BindUIObjectTree(uiObjectTree)

frameHostWnd:Create()

以上两行,将HostWnd对象和UIObjectTree对象关联,之后从HostWnd对象上创建出窗口来。

 
回到MainWnd.xml中,仔细看看如何定义一个模板:
<objtreetemplate id="HelloBolt.Tree" class="ObjectTreeTemplate">
以上节点定义中,节点名指定模板的类型,是对象树模板时指定为objtreetemplate, id属性指定模板id(需是XAR包内唯一的),class属性指定模板类,决定了可以在模板中设置的属性,以及从模板创建出来的对象类型。<attr>子节点中可以指定UIObjectTree的各种属性,这里设置其位置为-200,-200,2000,2000的矩形区域(Bolt引擎坐标系简介)。
如果UIObjectTree上没有加入任何UIObject, 它的渲染输出一定是空白的。为了达到效果图所示的效果,要在UIObjectTree上加入一个用于显示位图的UIObject——ImageObject:
<obj id="app.bkg" class="ImageObject">
以上xml节点在UIObjectTree模板上加入一个id为app.bkg ,class为ImageObject的UIObject。同一UIObjectTree上的不同UIObject的id必须不同(可以为空,但是为空时无法通过id索引到该对象),class为Bolt的各种内建UIObject类型,如 LayoutObject, ImageObject, TextureObject, TextObject等等, 也可以是在布局xml中通过control节点定义的自定义控件类型。同样在<obj>的<attr>子节点中,定义该ImageObject对象的各种属性,包括位置(left,top,width,height),透明度(alpha), 以及位图资源(image),就是我们要在窗口上显示的底图。
     <image>节点中指定的位图资源,是以字符串id标识的。Bolt用资源管理器来统一管理各种资源,包括位图,纹理,颜色,字体,曲线等等。在XAR包被加载时,XAR中的资源包会被Bolt的资源管理器加载。然后就可以在界面布局中通过资源的id来引用资源。
     现在我们来看看如何在XAR包中添加资源包。首先在XAR包的res目录里加入一个子目录, res/default/,资源包中需要在根目录存在resource.cfg文件以指定该资源包的名称。然后建立xml文件配置资源,分配资源id。在资源包中加入我们要使用的位图,即我们要在窗口中显示的背景图,将位图素材bkg.png放入default目录,为了方便管理,我们在资源包中加入子目录统一放置素材文件,这里放入default\bitmap目录中;建立bitmap.xml文件,在其中添加如下xml节点:
<XLUE>
<resource>
 <bitmap id="app.bkg" path="bitmap\bkg.png" />
</resource>
</XLUE>
定义一个id为app.bkg的位图资源,其素材为bitmap\bkg.png。这样,在MainWnd.xml中的ImageObject对象的<image>属性就表明,该ImageObject对象展示bkg.png这张位图(Bolt引擎资源简介) 。
     这样UIObjectTree的模板就定义好了,从该模板上创建的UIObjectTree对象上已经加入了一个ImageObject对象,并且该ImageObject对象展示bkg.png位图资源。当该UIObjTree关联到HostWnd上时,就会在窗口中显示出bkg.png。
     再看HostWnd的模板定义,xml节点如下:
<hostwndtemplate id="HelloBolt.Wnd" class="FrameHostWnd">
与UIObjectTree模板类似的id和class属性,Bolt提供了若干功能不同的HostWnd class(HostWnd手册),用于程序主窗口选择FrameHostWnd class。<attr>子节点中定义HostWnd的各种属性,<mainwnd>设1指定为主窗口;<layered>设1指定为Windows平台下的layered window,若设0为unlayered window,在windows下只有指定为layered window才可以为窗口指定透明度,当layered window遮盖其他窗口时,在窗口中贴出透明或者半透明的底图时才能正确被与下面的窗口内容混合(MSDN Layered Window)。若为unlayered window, 则无法半透明显示窗口;<left><top><width><height>指定HostWnd的大小和位置,注意因为UIObjectTree的渲染结果要在窗口中显示,所以窗口大小必须足够大才能将渲染结果完整的展示出来,因为我们要贴出的底图大小被设置为429*267,所以我们的窗口大小要不小于这个尺寸。    
        在布局xml中定义好了模板之后,还需要另外两步工作才能让定义好的模板可以在布局xml或者lua脚本中被使用:
1.   为了提高加载效率, Bolt加载template , control, animation等在XAR的布局xml中定义的元素时,需要一个映射表nametalbe.cfg指明要加载的某个template是定义在哪个文件中的,每次在XAR中更新了这些元素(比如新加入一个template, 或者重新指定了template 的 id等)时,需要使用XLUECL工具(XLUECL工具手册)更新nametable.cfg。在命令行中,用如下命令:
.\tools\xluecl.exe -xar .\HelloBolt\XAR\HelloBolt2\
CFG文件格式

  大多数情况下,很多程序都要保存用户的设置,办法有很多:注册表,日志文件...... 而很多程序都使用了一个专用的文件。为了方便起见,常常命名为*.cfg,有时甚至直接命名为Config.cfg。
  这只是一个为开发及使用方便而"发明"的一个后缀名。所以,这种文件没有固定的格式,其实也并不能算作是一种文件类型。

为HelloBolt2 XAR包生成nametable.cfg。
2.   HelloBolt2的XAR包中的配置文件package.cfg,相较HelloBolt1多出如下两个节点:
<nametablecfg path="./nametable.cfg" type="xml"/>
<mainres package="default"/>
分别指定该XAR的nametable文件和默认资源包,也就是HelloBolt2中包含图片的名为default的资源包。

onloda.lua中:

local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")
local frameHostWndTemplate = templateMananger:GetTemplate("HelloBolt.Wnd","HostWndTemplate")
if frameHostWndTemplate then  local frameHostWnd = frameHostWndTemplate:CreateInstance("MainFrame")if frameHostWnd thenlocal objectTreeTemplate = templateMananger:GetTemplate("HelloBolt.Tree","ObjectTreeTemplate")if objectTreeTemplate thenlocal uiObjectTree = objectTreeTemplate:CreateInstance("MainObjectTree")if uiObjectTree thenframeHostWnd:BindUIObjectTree(uiObjectTree)frameHostWnd:Create()endendend
end

bitmap.xml中:

<XLUE>
<resource><!--普通的位图资源--><bitmap id="app.bkg"  path="bitmap\bkg.png" />
</resource>
</XLUE>

MainWnd.xml中:

<!--XML最好存储为UTF-8编码-->
<xlue><objtreetemplate id="HelloBolt.Tree" class="ObjectTreeTemplate"> <!--objtreetemplate为对象树模板--><attr><left>-200</left><top>-200</top><width>2000</width><height>2000</height></attr><obj id="app.bkg" class="ImageObject"><attr><left>0</left><top>0</top><width>429</width><height>267</height><!--资源相关的属性使用资源定义xml中设置的资源名--><image>app.bkg</image><alpha>255</alpha>  <!--alpha透明通道值0为透明,255为不透明--></attr></obj>
</objtreetemplate><hostwndtemplate id="HelloBolt.Wnd" class="FrameHostWnd">  <!--hostwndtemplate为宿主窗口模板--><attr> <mainwnd>1</mainwnd><title>Bolt</title>  <!--宿主窗口标题--><layered>1</layered> <!--是否分层窗口,0表示非分层窗口,1表示分层窗口--><left>200</left> <top>100</top><!--注意这是容器窗口的大小,设置的要合理--><width>429</width><height>327</height><cacheleft>0</cacheleft> <!--结束矩形左上顶点纵坐标--><cachetop>0</cachetop> <!--结束矩形左上顶点纵坐标--><cachewidth>1000</cachewidth> <!--结束矩形右下顶点横坐标--><cacheheight>720</cacheheight> <!--结束矩形右下顶点纵坐标--><center>1</center><topmost>0</topmost> <!--是否顶层窗口,0表示非顶层窗口,1表示顶层窗口--><visible>1</visible> <!--窗口是否可见,0表示不可见,1表示可见--><enable>1</enable>   <!--窗口是否处于灰显状态,0表示灰显状态,1表示正常状态--><active>1</active>  <maxbox>1</maxbox>  <!--窗口风格是否包含WS_MINIMIZEBOX,0表示不包含,1表示包含--><minbox>1</minbox>  <!--窗口风格是否包含WS_MAXIMIZEBOX,0表示不包含,1表示包含--><minwidth>100</minwidth> <!--宿主窗口矩形最小宽度--><minheight>72</minheight>  <!--宿主窗口矩形最小高度--><maxwidth>1000</maxwidth>  <!--宿主窗口矩形最大宽度--><maxheight>720</maxheight>  <!--宿主窗口矩形最大高度--><sysmenu>1</sysmenu>        <!--窗口风格是否包含WS_SYSMENU,0表示不包含,1表示包含--><appwindow>1</appwindow> <!--窗口风格是否包含WS_EX_APPWINDOW,0表示不包含,1表示包含--><fps>30</fps> <!--窗口刷新频率--></attr>
</hostwndtemplate>
</xlue>

解读BOLT引擎例子——HelloBolt2相关推荐

  1. 几种还款方式解读(包含例子,正在更新)

    几种还款方式的解读(包含例子) 1.一次性还本付息(利随本清):    按日计息, 计算公式:当期利息=贷款本金(总贷款金额)*日利率*(提前还款日期-上期还款日期) 下期利息=剩余本金*日利率*(还 ...

  2. 一个简单的规则引擎例子

    本例使用的规则引擎包是RulesEngine,关于RulesEngine的介绍,请自行补充,这里只是一个极简单使用场景. 例子大体就是用户有一些优惠券,系统会根据用户订单情况,筛选可以使用的优惠券供用 ...

  3. 一步一步解读MT4的例子EA(init,sta…

    在MT4安装后,默认会给用户提供几个例子程序,这些程序对于新学习EA开发过程中有很大的帮助,下面我们就来对MACD Sample这个例子EA来做个解读,来看看别人是如何开发一个EA的. 首先是注释,在 ...

  4. php模板引擎 例子,PHP实现简单的模板引擎功能示例

    本文实例讲述了PHP实现简单的模板引擎功能.分享给大家供大家参考,具体如下: php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来.实 ...

  5. 十年磨一剑,深度解读火山引擎官方操作系统 veLinux

    在历经数十年在操作系统上的长期实践与沉淀,字节跳动于去年正式推出高性能的 Linux 操作系统 veLinux 并将其内核代码开源.作为字节跳动打造的首款高性能.高稳定性.安全易用的操作系统,veLi ...

  6. mysql引擎层存储层_MySQL存储底层技术:InnoDB底层原理解读

    原标题:MySQL存储底层技术:InnoDB底层原理解读 存储引擎 很多文章都是直接开始介绍有哪些存储引擎,并没有去介绍存储引擎本身.那么究竟什么是存储引擎?不知道大家有没有想过,MySQL是如何存储 ...

  7. BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面

    BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面 bolt 基本介绍 Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库.迅雷7是首个采用该引擎成功开 ...

  8. [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram

    在本节中,我们将展示一个带有编号步骤的图表.如果您按照步骤进行,从一个开始并遵循引导箭头,任意复杂性的C声明可以快速翻译为英语(也可以是任意复杂性).我们将通过忽略图中的typedef来简化声明.若要 ...

  9. 自我解读MVC三层架构原理

    MVC简单原理 (1)在我们最开始学习编程,开始写代码的时候:往往写的代码较为的混乱,层次不清晰,从而造成了维护与安全上的缺陷.这里就慢慢引出了框架的知识.能够是我们的代码变得层次清晰.分明,维护起来 ...

  10. 详解 Chrome 「V8 」引擎,让你更懂JavaScript !

    今天来聊聊 V8,它的主要职责是用来执行 JavaScript 代码的.在正式全面了解 V8 之前,先来了解下「JavaScript 的基本特性和设计思想」. 1.JavaScript 的基本特性和设 ...

最新文章

  1. 使用angular的好处_在项目中使用Angular的最大好处
  2. PHP命令行代码更新不及时,PHP脚本从命令行工作,而不是从cron
  3. R构建加权最小二乘回归模型(Weighted Least Squares Regression)
  4. STL Algorithms 之 unique
  5. MFC中OnInitDialog自动生成
  6. jQuery 人脸识别插件,支持图片和视频
  7. 【搜索引擎Jediael开发笔记】v0.1完整代码
  8. vc2010 mysql5.7_VC2010利用MySQL++访问mysql. 及连接池示例
  9. java接口_Java接口
  10. 2016.8.27一套简单的题解题报告
  11. Microsoft 安全公告 MS12-020 - 严重。请大家关注!!
  12. CSA FT1、FT2、FT4、FT5 和 FT6
  13. dell服务器运维,【产品鉴赏】戴尔DELL R710服务器
  14. 美国小学计算机编程课程,美国小学STEM课程案例研究
  15. 把opencv Mat 按位存成bmp二值图像 (1bit 1pixel)
  16. 微信小程序开发:Java后台MySQL数据库微信小程序页面
  17. 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
  18. 深入理解QStateMachine与QEventLoop事件循环的联系与区别
  19. STM32要按复位键才能下载问题解决
  20. 蒲丰投针计算机模拟ppt,蒲丰投针实验模课件.doc

热门文章

  1. 蓝桥杯C语言程序设计真题
  2. m3u8格式的视频链接怎么在自己电脑上播放
  3. 微软商店错误代码: 0x80131500解决方案
  4. 两万字《Java完全自学手册》15张导图,送给所有的零基础小白(建议收藏)
  5. Java学习手册:Java面向对象面试问题
  6. 山西计算机公共机房建设,山西省机房建设标准.doc
  7. JDBC连接池原理及分析
  8. win7原版系统安装及基本设置
  9. GE HYDRAN M2 IS200VCRCH1B IS200VRTDH1D IS200VTCCH1CBB IS200VTURH2BAC IS215VPROH1BD IS220PAICH2A
  10. asp.net图书馆管理系统