您好,欢迎访问三七文档
By张方雪DUI介绍DirectUI取名自微软的一个窗口类名“DirectUIHWND”,意为Paintonparentdcdirectly。即子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上.DUI不使用Win32标准控件,所有的控件都是使用GDI函数绘制在窗口上的.所有的对控件的绘制,以及消息消息向控件的路由,都由DUI库的开发者自己实现.介绍DUI的网站:的现状国内主流软件公司基本都在使用,腾讯,迅雷等.著名的有迅雷的BOLT引擎.有纯商业的界面库,如UIPower,价格不菲.WPF,QT,XAML开发里面都植入了DUI的理念,可以说,DUI已经是当前界面开发的隐形标准.DUI相对于传统Windows控件的优势:表现能力更强大,能做出更好的界面,定制性更好,也正符合国内软件商追求界面酷炫的目标.Duilib是一款开源的DUI界面库,小而全.Duilib开发的客户端Duilib的开发包里给出的DemoDuilib介绍网址:XML和脚本构造界面:使用xml配置界面控件布局使用xml描述界面风格XML语法简单,易于学习和掌握支持改变皮肤色调支持大多数控件透明,包括子窗口透明支持png,bitmap,gif,ico图片格式。支持带透明通道的png图片遵循BSD协议Duilib目前支持Windows32、WindowCE、Mobile等平台Duilib的整体设计图Duilib类库层次工具库:一些基础类定义1,UI相关:CPoint/CSize/CDuiRect;2,简单容器:CStdPtrArray/CStdValArray/CStdString/CStdStringPtrMap,3,对窗口的封装:WindowImplBase.控件库:两个主要控件基类CControlUI,是各个控件的基类,如Button,Label等.CContainerUI,是各个容器的基类,如Layout,List等.(Tree控件是基于List控件实现的)核心库:xml解析(UIMarkUp),控件绘制(RenderEngine),消息路由(UIManager),窗口过程等Duilib在界面绘制之外的功能比较少,比如数据库操作,网络操作等.可以考虑结合到WTL或者MFC等框架里面.Duilib的消息流程消息流程的主循环是:CPaintManagerUI::MessageLoop首先创建窗口,CWindowWnd::Create,Create里面会把窗口对象的指针同窗口句柄绑定起来.WindowImplBase::HandleMessage,用户自己实现的窗口过程.这里会调用CPaintManager的MessageHandler函数,这个函数实现了大部分消息的默认处理,完成了所有控件的绘制,界面的更新.Event:Duilib会把消息封装成Event,通知给各个控件.Notify:如果想在窗口类中处理一些控件消息,就可以调用这个函数,让控件通知窗口.窗口类会在OnCreate时把自己注册到接收Notify的队列里面.按钮点击动作的完成CPaintManager::MessageLoop(首先是主窗口获得了消息,因为只有一个窗口.)主窗口对于WM_LBUTTONDOWN消息的处理.FindControl(pt);查找当前鼠标位置的叶节点控件,递归操作.(在控件树上面进行搜索)pControl-Event(event);控件对消息进行相应的函数,这里Button会把自己设置成pushed状态m_pEventClick=pControl;//PaintManager会把该控件记录为当前被点击的WM_LBUTTONUP的处理,调用m_pEventClick的Event函数,响应鼠标左键弹起的消息在这里会通过SendNotify这个函数,把Button自己被点击过的消息发送给主窗口,主窗口进行响应.一般Button自己不做太多处理,只是封装一个消息发送给主窗口,有主窗口进行集中处理.(为什么不自己处理?可以理解为,主窗口拥有更多的资源,适合做一个个控件之间通信的调停者.)XML的解析/控件的创建CMarkup库解析xml文件,生成xml的DOM节点树递归地处理各个节点,生成DUI对象.DUI对象生成顺序:1,全局资源,如Image,Font等2,Window的属性3,各个顶级控件,典型的是一个Layout4,对各个控件递归地构造其子控件对象.DUI控件属性的设置:1,首先对控件施用Default属性2,如果控件对于某个属性定义了自己的值,那么就更新一下此属性.比如Font属性.控件的绘制Duilib控件的绘制底层依赖的是一些GDI绘图函数.CRenderClip:(圆角)矩形裁剪,为了是把控件限定在父控件的内部.CRenderEngine(封装GDI)实现的绘制函数DrawImage:DrawLine:MoveToEx,LineTo.DrawRect:Rectangle.DrawRoundRect:RoundRect函数.DrawText:DrawTextDrawHtmlText:自实现,简单的html解析,然后绘制.RenderEngine的底层函数,就是在主窗口的DC上面,调用一些绘图函数.控件的绘制CPaintManager::MessageLoop处理WM_PAINT消息调用Root(CContainerUI类型)控件的DoPaint函数CContainerUI类型的DoPaint会首先绘制绘制自己,然后调用各个子控件的绘制(这样的效果就是子控件展示在父控件上面)CControlUI类型没有控件,DoPaint函数里面会调用一些控件自己的私有函数,根据控件目前的状态,完成绘制功能.绘制顺序:PaintBkColor-PaintBkImage-PaintStatusImage-PaintText-PaintBorder调用关系:MessageLoop调用Root的DoPaint,调用子控件的DoPaint,DoPaint调用RenderEngine的函数,最底层就是windows的GDI函数了.DUI对于软件测试的影响不能使用基于句柄,索引控件然后发送消息这样的测试方法.基于坐标的,快捷键的自动化测试方法仍然有效.MSAA机制失效(类似使用句柄).Duilib基于xml组织资源和布局,估计可以让客户端扩展出一些COM接口,用于操作控件树,进行相应的自动化测试.Sogou浏览器的DUI估计是基于Windows控件的,所以基于句柄的测试方法部分是行得通的.Duilib和多线程Duilib对多线程支持不好,如果想在线程里面更新其他线程里面的窗口,需要向窗口发送自定义消息.窗口是在线程内创建的不会发生冲突.可以对所有资源加锁,不过不太现实.Duilib里面一些跟消息有关的都是全局数组,而且没有加锁,所以对多线程支持不好.Duilib对html的支持支持一些很简单的语法,如btext/b这样的形式.如果想对全部html进行支持,有几个可选的方案:IWebbrowser2控件(利用IE控件展示html),这个在Duilib里面支持.ChromeEmbedded框架(Chrome展示html的框架,libcef.dll)AppJS(ChromeEmbedded+NodeJs)QQ是DUI(QQ自己的UI引擎)+libcef的组合对HTML的全面支持,使得客户端UI编程转变成了Web前端编程.一个观点,DUI的终极形式就是html,而DUI相对而言就是一个轻型的浏览器实现.可以把浏览器的内部的页面内容也理解为客户端的一部分,这样浏览器就是展现形式最强的客户端.对Duilib的扩展建议增加对复杂html的支持,或者完全整合libcef.增加对多线程的支持.一般界面库,都用发消息实现.修复bug.(比如同控件关联的Timer).开发者文档.增加默认皮肤图片(比如主窗口中标配的三态的,Minimize,Maximize,CloseButton).渲染器接口,目前是使用的GDI,其实可以接入其他渲染模块,比如OPENGL等.谢谢!
本文标题:Duilib讲解
链接地址:https://www.777doc.com/doc-5472348 .html