大家都知道,引擎的核心概念是对象树和元对象,所谓元对象,是不可分割的具备特定功能的UIObject,引擎核心提供了一组功能各异的元对象,使用者只需要通过这些对象的组合,就可以搭建出各式各样的界面。下面,对这些元对象做一个简单分类,并按类型进行简单说明。
按照是否可渲染,可以分成逻辑对象和可渲染对象。逻辑对象一般用来作为占位对象、控制对象或者影响其它对象的对象(如MaskObject);显示对象一般都可以显示一定的内容,一般来说都受alpha、limitrect、zorder等属性的影响,都参与整个对象树的渲染过程,支持脏矩形等(实窗口对象除外)
逻辑对象包括LayoutObject、MaskObject、ResizeObject、CaptionObject、NcObject、BlurObject,其余对象为可显示对象。
按照是否存在实窗口,又分为实窗口对象和非实窗口对象。实窗口对象是出于展示一些特殊功能控件(如IE、Flash)或者用户自己的实窗口(如XMP的视频播放窗口),而专门定制的元对象。同一个对象树上面,实窗口对象的zorder要高于其它所有非实窗口对象(实窗口对象之间zorder生效),alpha通道亦不生效,焦点和taborder等也和其它对象有所不同,需要特殊对待。
实窗口对象包括RealObject、WebBrowseObject、FlashObject,其余对象为非实窗口对象
按照是否作用于对象树绑定的hostwnd,可以分成控制对象和非控制对象,控制对象主要是控制hostwnd的某些特性,比如标题区域、拖动改变大小区域、毛玻璃区域等,一般都是用来满足目前windows下桌面开发的一些常见需求
控制对象包括CaptionObject、ResizeObject、NcObject、BlurObject,其余对象为非控制对象
下面,我们详细介绍下每个对象:
一、 LayoutObject 根逻辑对象
所有元对象和组合对象的根对象,是顶级的逻辑对象,本身不显示任何内容,此对象满足所有对象都具备的核心方法和属性,具备以下核心特性:
l 支持添加子对象
l 支持control(组合对象)模式
l 支持位置表达式,可以用来动态排版
l 支持visible和childvisible
l 支持enable和childenable
l 支持zorder特性
l 支持焦点focus特性
l 支持taborder、tabgroup、tabstop特性
l 支持鼠标和键盘事件等用户输入事件
l 支持元对象的核心事件,比如OnInitControl、OnPosChange等
l 支持捕获鼠标输入(capturemouse)
l 支持绑定动画
l 支持使用蒙层
l 支持设置光标
l 支持限制子对象区域(limitchild)
l 支持拖放
二、 ImageObject位图对象
用以在界面展示一张位图(设置指定的位图资源),具备以下核心特性:
l 支持设置位图资源id或者位图句柄(XL_BITMAP_HANDLE)
l 支持图片透明部分hittest穿透
l 支持对齐方式
l 支持缩放,在对象大小和图片大小不一致时候使用
l 支持反走样,提供更好的缩放效果
三、 TextureObject 纹理对象
用以在界面展示一张纹理(纹理概念请参考相关的介绍文章),具备以下核心特性:
l 支持设置纹理资源id或者位图句柄(XL_TEXTURE_HANDLE)
l 所设置的纹理资源的特性会直接反馈到TextureObject上,比如九宫纹理,平铺纹理等
四、 TextObject 文本对象
用以在界面展示一段文本内容,具备以下核心特性:
l 可以指定所使用的文本渲染引擎,目前支持FreeType和GDI(包括gdi和gdi+两种)
l 可以指定单行显示或者多行显示
l 可以设定行距
l 可以设置文字省略模式
l 可以设置对齐模式,包括左右对齐和上下对齐
l 可以设置背景色和前景色
l 可以设置背景是否透明,这样可以直接使用下面的图片对象作为文字背景
l 可以设置文字的阴影效果
l 可以设置文字的发光效果
l 支持多语言
五、 EditObject 编辑框对象
用以在界面上展示一段可编辑的文本,或者接受用户的输入,基于Windows的RichEdit核心,功能强大,部分情况下可以代替TextObject使用,具备以下核心特性:
l MFC和ATL里面的Edit的几乎所有功能,比如插入文本、操纵选中文本、行/字/索引互转、剪贴板功能、滚动条功能,以及各种模式,比如密码模式、单行/多行、只读模式等等
l 支持背景透明,可以直接使用下面的图片对象作为背景
l 支持隐藏光标模式
l 支持是否处理Tab和Return按键
l 支持自定义滚动条,这样可以很方便的使用引擎来实现华丽的滚动条
l 支持数字模式、密码模式等
l 支持禁用输入法,在密码模式下更有效
l 支持设置密码显示字符
l 支持设置文本颜色、背景颜色
l 支持设置视图边距,排版更强大(viewinset)
l 支持资源里面配置字体,更加方便
六、 RichEditObject 富文本对象
用以在界面上展示一段富文本内容,采用自主编写的排版引擎,功能上是EditObject的超集,接口和属性上和EditObject一致,但是有众多EditObject不具备的功能,具体来说有以下核心特性:
l 支持上述EditObject的所有特性
l 支持嵌入其它元对象,比如ImageObject、TextureObject以及实窗口对象比如FlashObject等,将引擎的元对象和组合特性发挥到极致,使得在插入gif和图片方面,RichEditObject比windows下的RichEdit有更强大的功能
l 支持设置文本格式(charformat),相比windows下的RichEdit,有更大的自由度
l 支持设置后端的字体渲染引擎,支持freetype和gdi+两种渲染引擎
l 支持富文本的复制、粘贴,支持元对象的复制、粘贴,方便扩展
l 支持超链接的显示定制,支持自定义超链接识别
七、 FillObject 颜色填充对象
用以在界面上展示指定区域的指定颜色的填充,属于矢量对象,具备以下核心特性:
l 支持多种填充模式,包括行渐变、圆形渐变和单色模式
l 起始位置和结束位置可指定表达式,关联对象自身的位置,在对象缩放时候自动跟随,方便使用
l 支持使用颜色alpha通道,并且alpha通道支持渐变
l 支持是否使用颜色alpha通道,使用alpha通道模式下,任何一个点都会使用颜色本身的alpha和对象自身的alpha叠加而来
l 起始颜色和结束颜色均可以直接接受颜色值或者资源id,可以动态设定
八、 MaskObject 蒙层对象
高级的逻辑对象,提供蒙层效果,用以控制指定子对象上的每个像素的alpha,也即是蒙层对象里面的每个像素都可以作为alpha通道,叠加到指定子对象对应的像素上面,用以生成各种特殊效果(比如圆角效果等),具备以下核心特性:
l 蒙层可以对子对象里面的 ImageObject、TextureObject、TextObject、FillObject、LineObject、RectangleObject生效,其它对象暂不支持
l 蒙层作用区域可以动态配置,并且支持表达式,和蒙层对象自身区域联动,更方便使用
l 蒙层源可以设置位图、纹理或者颜色填充三种类型,方便定制各种特殊的蒙层效果
l 蒙层源是位图时候,可以指定资源id,可以指定是否拉伸位图
l 蒙层源是颜色填充类型时候,可以像FillObject一样配置渐变类型和渐变色
l 可以指定使用蒙层源的指定通道,比如R通道或者A通道
九、 SeqImageObject 序列帧对象
高级对象,用以在界面上展示一连串的连续图片,相比其它对象,该对象本身具有帧的概念,可以动态播放一组图片,具备以下核心特性:
l 可以播放一个GIF资源(需要依赖XGP库)
l 可以播放ImageSeq(XL_IMAGESEQ_HANDLE)资源,而不必依赖SeqFrameAnimation动画
l 可以设置播放间隔,控制播放更加随意
l 直接在元对象层面控制动画的播放,比如使用Play、Pause和Stop来控制播放,更加简洁高效
l 满足元对象的一切特性,比如剪裁limitrect、alpha通道
l 支持逆序播放、循环播放等高级
l 具备更高效率,可以同时在界面存在多个SeqImageObject
十、 CaptionObject 标题对象
直接指定界面某个区域为caption(windows窗口系统的概念),可以用来拖动所在窗口,包括双击最大化等,属于控制对象,具备以下核心特性:
l 可以指定是否是caption,用以动态打开或者关闭
l 可以像其它对象一样截获鼠标事件,来取消默认操作,比如双击最大化等
l 可以通过多个CaptionObject的组合以及和其它对象的叠加,来定制需要的caption区域,更容易使用
l 满足LayoutObject的所有特性和事件,比如limitrect,enable,visible等
十一、 ResizeObject 调整大小对象
直接指定界面某个区域为resize(windows窗口系统的概念),可以用来拖动改变窗口大小,属于控制对象,具备以下核心特性:
l 可以指定resize类型,包括上下左右四个方向、上左/上右/下左/下右四个角方向
l 可以指定是否是resize,用以动态打开或者关闭
l 可以通过多个ResizeObject的组合以及和其它对象的叠加,来定制需要的resize区域,更容易使用
l 满足LayoutObject的所有特性和事件,比如limitrect,enable,visible等
十二、 NcObject 非客户区对象
可以用来满足CaptionObject和ResizeObject对象的需求,设计的主要目的是主要是用来监听所绑定的hostwnd的NcActivate事件,用以做专门的效果处理,具备以下核心特性:
l 通过监听OnControlHitTest事件,可以动态模拟CaptionObject和ResizeObject,使用更为灵活
l 通过监听OnNcActivate事件,可以处理hostwnd的NcActivate事件,模拟一些特殊效果
十三、 BlurObject 毛玻璃对象
主要用来使界面呈现windows vista以及以后界面的毛玻璃效果,和引擎的元对象、hostwnd巧妙结合,从而极为简洁地实现毛玻璃效果,且更方便控制区域,具备以下核心特性:
l 支持元对象的所有核心特性
l 支持区域剪裁,支持叠加
l 可以设置是否启用TransitionOnMaximized(具体可以参考msdn相关内容),用以不同的毛玻璃效果
l 可以设置椭圆区域,方便的处理圆角等特殊情况
l 可以根据操作系统版本、是否启用复合桌面、所绑定hostwnd的情况以及应用程序的全局设置,来智能判断是否开启Blur效果
十四、 RealObject 实对象
用来在基于引擎的界面上,以窗口模式展示一个元对象,属于实窗口对象,可以设置进来一个用户自定义的GDI窗口,具备以下核心特性:
l 支持LayoutObject的绝大多数功能(由于系统限制,zorder和alpha不支持)
l 可以设置一个自定义的GDI窗口(HWND)
l 支持剪裁(limitrect)
l 实窗口对象之间支持zorder
l 可以渲染当前实对象显示内容到XLBitmap,方便动画
十五、 WebBrowseObject 浏览器对象
用来在界面上展示网页内容,是非常常用的几个对象之一,采用IE内核,具备以下核心特性:
l 支持打开指定支持,支持基本的导航操作
l 支持设置自定义的external接口
l 可以直接获取IWebBrowser2接口进行操作
l 可以设置是否启用邮件菜单
l 可以设置是否禁用脚本错误
l 支持一些其它常用的方法和属性,比如获取LocationName和LocationUrl,支持DocHostFlags等
l 支持常用的事件,比如NavigateComplete2,NewWindow等
l 支持直接截获download事件
十六、 FlashObject flash对象
用来以窗口模式展示/播放一个flash资源,需要系统安装Adobe的Flash控件,属于实窗口对象,目前已经开放flash控件的核心方法和属性,具备以下核心特性:
l 加载一个flash文件
l 播放/暂停/前进/后退等核心控制
l 可以设置是否循环播放
l 可以设置是否禁用右键菜单
l 可以设置对齐模式
l 可以设置缩放模式
l 可以指定需要使用的flash控件模块
l 支持flash控件的CallFunction方法,方便和flash素材脚本交互
l 支持flash的FlashVars属性,可以设置/获取flash素材变量
l 支持获取当前使用的flash版本
l 支持输出日志,方便flash素材导致的崩溃定位
十七、 WindowlessFlashObject 无窗口模式flash对象
基本功能和FlashObject相同,不同的是该对象不是以窗口模式展示,而是像ImageObject、TextureObject等可视对象的形式来展示,更贴近引擎特性,避免实窗口对象的缺点,具备以下核心特性:
l 上述的FlashObject的各种特性
l 避免实窗口对象的各种问题,满足LayoutObject的所有方法和属性
l 支持zorder特性,可以被其它非实窗口对象覆盖和剪裁
l 支持alpha特性,可以实现半透明渲染或者alpha渐变动画等
l 支持启用directdraw,提高绘制效率
l 支持fixalpha模式,修复flash控件在全透明窗口上绘制alpha通道出错的bug
十八、 LineObject 线对象
在界面上显示一条直线,属于矢量对象,具备以下核心特性:
l 可以直接设置画笔XL_PEN_HANDLE资源
l 支持LayoutObject的所有特性,比如支持对象alpha,支持剪裁,支持叠加,支持mask等等
l 直线绘制支持反走样
l 支持实线和虚线两种模式
l 支持设置直线颜色
l 支持设定直线的起始位置和结束位置,相当于支持画笔原点,并且支持表达式,可以和PenObject自身区域联动,更方便使用
十九、 RectangleObject 矩形对象
在界面上显示一个矩形框,属于矢量对象,具备以下核心特性:
l 可以设置画笔XL_PEN_HANDLE资源,故而支持实线框和虚线框两种类型,直线绘制支持反走样
l 支持LayoutObject的所有特性,比如支持对象alpha,支持剪裁,支持叠加,支持mask等等
l 可以设置画刷XL_BRUSH_HANDLE资源,用来填充矩形内部
l 可以设定边框颜色
l 可以设定矩形的起始位置和结束位置,并且支持表达式,可以和RectangleObject自身区域联动,更方便使用