《Duilib初探.pptx》由会员分享,可在线阅读,更多相关《Duilib初探.pptx(16页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Duilib初探初探DUI介绍DirectUI 取名自微软的一个窗口类名“DirectUIHWND”,意为Paintonparentdcdirectly。即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上.DUI不使用Win32标准控件,所有的控件都是使用GDI函数绘制在窗口上的.所有的对控件的绘制,以及消息消息向控件的路由,都由DUI库的开发者自己实现.介绍DUI的网站:http:/www.viksoe.dk/code/windowless1.htmDUI的现状国内主流软件公司基本都在使用,腾讯,迅雷等.著名的有迅雷的BOLT引擎.有纯商业的界面库,如UIPower,价格不菲
2、.WPF,QT和Android开发里面都植入了DUI的理念,可以说,DUI已经是当前界面开发的隐形标准.DUI相对于传统Windows控件的优势:表现能力更强大,能做出更好的界面,定制性更好,也正符合国内软件商追求界面酷炫的目标.Duilib是一款开源的DUI界面库,小而全.Duilib开发的客户端Duilib开发的客户端(Demo)Duilib介绍网址:https:/ 使用xml描述界面风格 XML语法简单,易于学习 和掌握 支持改变皮肤色调 支持大多数控件透明,包括子窗口透明 支持png,bitmap,gif,ico图片格式。支持带透明通道的png图片遵循BSD协议Duilib目前支持Wi
3、ndows32、WindowCE、Mobile等平台Duilib的整体设计图Duilib类库层次工具库:一些基础类定义1,UI相关:CPoint/CSize/CDuiRect;2,简单容器:CStdPtrArray/CStdValArray/CStdString/CStdStringPtrMap,3,对窗口的封装:WindowImplBase.由于以上类的存在,使得Duilib基本自给自足,不依赖其他其他库.控件库:两个主要控件基类CControlUI,是各个控件的基类,如Button,Label等.CContainerUI,是各个容器的基类,如Layout,List等.核心库:xml解析,控
4、件绘制,消息路由,窗口过程等Duilib的消息流程消息流程的主循环是:CPaintManagerUI:MessageLoop首先创建窗口,CWindowWnd:Create,Create里面会把窗口对象的指针同窗口句柄绑定起来.WindowImplBase:HandleMessage,用户自己实现的窗口过程.这里会调用CPaintManager的MessageHandler函数,这个函数实现了大部分消息的默认处理,完成了所有控件的绘制,界面的更新.Event:Duilib会把消息封装成Event,通知给各个控件.Notify:如果想在窗口类中处理一些控件消息,就可以调用这个函数,让控件通知窗口
5、.窗口类会在OnCreate时把自己注册到接收Notify的队列里面.按钮点击动作的完成CPaintManager:MessageLoopWM_LBUTTONDOWN的处理.FindControl(pt);查找当前鼠标位置的叶节点控件,递归操作.pControl-Event(event);控件对消息进行相应的函数,这里Button会把自己设置成pushed状态m_pEventClick=pControl;/PaintManager会把该控件记录为当前被点击的WM_LBUTTONUP的处理,调用m_pEventClick的Event函数,响应鼠标左键弹起的消息在这里会通过SendNotify这个
6、函数,把Button自己被点击过的消息发送给主窗口,主窗口进行响应.以上过程,基本是对Windows消息路由的模拟XML的解析/控件的创建CMarkup库解析xml文件,生成节点树递归地处理各个节点,生成DUI对象.DUI对象生成顺序:1,全局资源,如Image,Font等2,Window的属性3,各个顶级控件,典型的是一个Layout4,对各个控件递归地构造其子控件对象.DUI控件属性的设置:1,首先对控件施用Default属性2,如果控件对于某个属性定义了自己的值,那么就更新一下此属性.比如Font属性.控件的绘制Duilib控件的绘制底层依赖的是一些GDI绘图函数.CRenderClip
7、:(圆角)矩形裁剪,为了是把控件限定在父控件的内部.CRenderEngine(封装GDI)控件的绘制CPaintManager:MessageLoop处理WM_PAINT消息调用Root(Ccontainer类型)控件的DoPaint函数CContainerUI类型的DoPaint会首先绘制绘制自己,然后调用各个子控件的绘制CControlUI类型没有控件,DoPaint函数里面会调用一些自己的私有函数,根据控件目前的状态,完成绘制功能.绘制顺序:PaintBkColor-PaintBkImage-PaintStatusImage-PaintText-PaintBorder上面的几个函数,底
8、层就是封装得CRenderEngine里面的函数了.Duilib和多线程Duilib对多线程支持不好,如果想在线程里面更新其他线程里面的窗口,需要向窗口发送自定义消息.窗口是在线程内创建的没有问题.可以对所有资源加锁,不过不太现实.Duilib对html的支持支持一些很简单的语法,如text这样的形式.如果想对全部html进行支持,有几个可选的方案:IWebbrowser2控件(利用IE控件展示html)ChromeEmbedded框架(Chrome展示html的框架)AppJS(ChromeEmbedded+NodeJs)QQ电脑管家是DUI+HTML的组合对HTML的全面支持,使得客户端UI编程转变成了Web前端编程.谢谢!