Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析);通过XML布局界面,将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率。一般常用于开发小型项目Windows桌面客户端软件;其子窗口不以窗口句柄的形式创建,只是逻辑上的窗口,绘制在父窗口之上。目前开源协议以BSD发布,可使用于商业应用,好了,其他更为详细的介绍,请查阅其官网或百度。

  源码获取:

    目前duilib不在被维护,基本上网络中各种duilib版本都是被个人维护,原始duilib源码可以在github:https://github.com/disable/duilib;中获取,此外比较活跃的版本:https://github.com/redrains/DuiLib_Redrain;以及https://github.com/duisharp/DuiLib_Ultimate;另外包含一个扩展版本:https://github.com/shaoyuan1943/Duilib_Ext;为了便于理解dullib项目,我们将采用原始版本的duilib源码分析。

  源码文件组织:

    源码文件中主要分为:DuiLib库、用以XML脚本配置的DuiDesigner设计器、doc文档入门手册、bin编译后的设计器和duilib.dll以及各demo需要的xml资源、各种用例demo、包含各种控件的属性列表.XML、其他不重要的文件;

  题外话--》源码分析步骤:

    基本上作为分析源码的步骤大致应该是:

    1. 阅读官方简介,了解其特性、功能、应用场景;

    2. 获取源码和开发文档等一系列说明文档;

    3. 思考自己开发该项目应该会如何架构、功能实现等;

    4. 编译源码、顺利执行程序,观察执行效果,从入口点跟踪程序;

    5. 先了解项目大致运行方式、模块组织结构,体会其中可以学习的设计模式;

    6. 再从细节上学习其使用到得惯用法、奇淫技巧;

    7. 与第3步作对比,感受项目实现和自己的想法的异同点;

    8. 在学习过程中作笔记、画草图,此后若有时间建议可以自己尝试实现该项目,拷贝部分源码分步骤学习也是不错的方式。

    事实上,每个人学习的方式不同,有的人会从开发文档或入门手册开始,有的人会从demo用例开始了解使用。

  以后将以DuLlib库文件分析说明,其他如设计器请自行查看入门手册和使用,因设计器会产生很多无用代码且存在BUG,后期配置XNL时可手动填写即可,填写后可以设计器简单查看效果即可:

  DuLlib库:

    文件结构:

      Core:核心组件(渲染器、容器、构建器、解析器、控件基类);

      Layout:界面布局组件(水平、垂直、子控件、Tab等);

      Utils:辅助工具相关(解压缩、图片、窗口基类、委托等);

      Control:各种控件(button、combox、label、checkbox、list等);

    执行流程:

      以下以TestApp1作为入手demo;找到入口点:WinMain,可以看到实际上是对Win32程序的另外一套不同于MFC框架的封装过程;

      1. CPaintManagerUI:界面显示、消息管理类;此处其设置当前应用程序实例句柄以及实例所需要的资源路径目录;

      2. 初始化COM组件(::CoInitialize() ),以使得duilib可调用COM相关函数;

      3. 创建当前窗口实例并创建、显示窗口,执行CPaintManagerUI的消息循环;

      4. 卸载COM组件(::CoUninitialize() )。

      注意:申请的资源pFrame并没有显式地析构,事实上在退出消息循环前已被析构,请留意消息WM_NCDESTROY,并调用了OnFinalMessage(hWnd)执行了析构;

      运行该程序,一个比较炫的界面展示在我们面前,我们通过断点跟踪每一个步骤:

     我们重点关注第3个流程,窗口如何被创建、界面是如何布局、消息如何流转等;进入Create函数,一眼看见我们熟悉的注册窗口中定义窗口类,

注册窗口、创建窗口;其中重点关注注册窗口类中的消息处理函数CWindowWnd::__WndProc;在创建窗口前(窗口已存在),执行了一系列的操作;

      __WndProc首先得到消息WM_GETMINMAXINFO,然后是WM_NCCREATE,该消息内部处理为保存当前句柄对象,并将本类对象放置在窗口的用户数据中,这样后期可以取出该对象,

    并直接使用该对象成员处理函数即可,实现类静态或全局处理函数转化为类普通成员消息处理函数的目的,即HandleMessage;此外还有其他的消息,如WM_NCSIZE, WM_SIZE等,

    其中消息WM_CREATE下的构建器将实际地根据提供的XML配置、遍历创建各控件元素、并将本类对象和创建的root根控件依附于绘制管理器中;

    消息流转大体方式为:CWindowWnd::__WndProc -> HandleMessage -> CPaintManager::MessageHandler;其中有些消息不被处理将还给::DefWindowProc或

    ::CallWindowProc默认处理;

    消息循环:调用CPaintManagerUI中的MessageLoop,内部采用GetMessage、TranslateMessage、DispatchMessage获取消息、翻译消息、分派消息;其中在调用全局的

    TranslateMessage前,先调用了CPaintManagerUI::TranslateMessage,给予用户自己翻译消息码的机会;  

  基本的流程框架如上,若要站在一个比较高的角度去看整体框架,需要对所有的组织结构有所了解,对于初次接触duilib的话可以先看文档是否有对整体结构的文档说明,然后再对症下药,从自己感兴趣的部分入手;不过没有关系,我们一步一步来,接下来我们将对各组织部分的主要内容进行详细的分析。

      

Duilib源码分析(一)整体框架的更多相关文章

  1. Duilib源码分析(六)整体流程

    在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...

  2. jQuery源码分析之整体框架

    之前只是知道jQuery怎么使用,但是我觉得有必要认真的阅读一下这个库,在分析jQuery源码之前,很有必要对整个jQuery有个整体的框架概念,才能方便后面对jQuery源码的分析和学习,以下是我总 ...

  3. [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构

    [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...

  4. [源码分析] 定时任务调度框架 Quartz 之 故障切换

    [源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...

  5. UiAutomator源码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源码分析之启动和运行>我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge ...

  6. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...

  7. jQuery 2.0.3 源码分析core - 整体架构

    拜读一个开源框架,最想学到的就是设计的思想和实现的技巧. 废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery ...

  8. jQuery源码分析系列 : 整体架构

    query这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍 我也不会照本宣科的翻译源码,结合自己的实际经验一起拜读吧! ...

  9. RecyclerView源码分析(一)--整体设计

    RecyclerView这个控件出来已经有一段时间了,如果看这篇文章的你,还没有使用过这个控件.那请先去学习怎样使用.不然看也白看.这里奉上一些关于介绍RecyclerView使用方法的优秀博客: 鸿 ...

随机推荐

  1. SQLServer------Join的使用方法

    参考菜鸟教程网: http://www.runoob.com/sql/sql-join.html select a.Canteen,b.OrderNum,b.CreateTime,c.Name fro ...

  2. Redis常用命令(String数据类型)

    一.概述:      字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中 ...

  3. ASP.NET知识总结 (未完) 本人新手

    1:HTTP的工作方式是什么?1)客户端提交表单请求处理 Request2)服务器端处理程序进行处理 Handle3)服务端相应 Response 2:1)get(默认值)是通过地址栏的URL显式地传 ...

  4. protobuf编译出错的解决方案(iOS,OSX)

    protobuf 最近使用protobuf,变编译工具时遇上一点问题.现在附上解决方案 编译过程 完全参照 https://github.com/alexeyxo/protobuf-objc 编译出错 ...

  5. web自动化工具-liveStyle

    web自动化工具-liveStyle LiveStyle. The first bi-directional real-time edit tool for CSS, LESS and SCSS主要用 ...

  6. Python 3.x 连接数据库(pymysql 方式)

    ==================pymysql=================== 由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 ...

  7. JS验证只能输入数字,数字和字母等的正则表达式

    JS判断只能是数字和小数点 0.不能输入中文1)<input onpaste="return false;" type="text" name=" ...

  8. python之路十五

    CSS position 属性 定义和用法position 属性规定元素的定位类型.说明这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身 ...

  9. iOS sqlite数据库图像化查看

    问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...

  10. signalR selfhost 版本兼容问题

    一.异常简要说明 最近在学习signalR,i按照http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 这 ...