上一节了解了大体流程,但是界面控件元素是如何被加载、解析、构建、管理、控件消息如何处理的呢?接下来我们将结合控件构造器进行分析;

  CDialogBuilder:控件构造器,主要用以解析xml配置文件并以此创建相应控件及相关属性。

  类成员数据:

    m_xml:xml解析器,用以读取并解析xml配置文件;

    m_pCallback:构造器回调函数,用以给予用户可以实现自定义的构造控件对象的方式;

    m_pstrtype:以NULL为结束符的字符串,资源类型,参数含义同EnumResLangProc函数中的IPszType,字符串指定了那些被列举的语句资源的类型名;如:RT_ACCELERATOR、

    RT_CURSOR、RT_VERSION等;

  类成员函数:

  Create:

    重载了的Create函数,首先第一个函数Create(STRINGorID xml, LPCTSTR type, IDialogBuilderCallback* pCallback, CPaintManagerUI* pManager, CControlUI* pParent);

    可以看到,此函数内部只是通过xml解析器分类别地方式加载XML文件,参数xml,可以为XML文件路径名、压缩包或是以'<'开始的字符串资源(XML文件内容)、资源ID,

    若xml为空,则通过加载资源模块句柄或是可执行应用程序句柄资源模块中加载类型为type的资源;pCallback为构造器回调函数;pManager为绘制管理器对象,用以对解析构建的控件或资源的管理、绘制;

     pParent:控件父窗口,用以作为解析构建后各控件的父窗口;

    注意:内部xml解析器通过三种方式解析:一种解析以"<"开头的文件内容字符串Load,二种解析XML文件路径名LoadFromFile,三种解析以可执行应用程序或是dll资源内容加载LoadFromMem;

    XML解析器后期将分析。

      第二个Create函数,主要在第一个Create函数基础上,实现真正的解析、遍历、构建的过程;返回第一个构建的控件对象;

    内部具体过程:

      1. 获取到xml中root根节点;

      2. 从根节点起,对根节点一般是Window节点下的子节点的兄弟节点遍历,找到诸如:Image、Font、Default等各节点的属性信息并添加到pManager中以便于以后显示、绘制需要;

      3. 单独对节点Window解析,获取到本窗口的窗口信息、大小、背景、颜色、透明度等信息;

      4. 调用私有成员函数_Parse,内部主要实现获取Window节点下的子节点Include、TreeNode、以及各种控件,遍历并创建相应控件和子控件;

      5. 对于4中的Include节点,根据该节点的属性count和source以及传入的参数资源类型type,确定是文件或是资源再次分别调用Create两个重载函数创建子控件;

      6. 对于4中的TreeNode节点,先获取设置该控件默认属性并应用和其他属性覆盖部分默认属性,此外再次通过_Parse解析其子节点及附加控件;

      7. 对于4中无法识别的节点,一部分为用户通过CPaintManagerUI::GetPlugins()插件的方式创建该节点对象;或者是另一部分通过m_pCallback构造回调函数创建用户自定义类型对象,

        剩余若不被处理,将被忽视;

      8. 对于4中的其他控件,均是先获取设置该控件默认属性并应用和其他属性覆盖部分默认属性;所有控件、节点均会被添加到pManager中管理。

    GetMarkup:获取内部解析器对象地址指针;

    GetLastErrorMessage:获取xml解析最近错误信息;

    GetLastErrorLocation:获取xml解析最近错误位置。

  接下来将介绍其XML解析器CMarkup。

    

Duilib源码分析(二)控件构造器—CDialogBuilder的更多相关文章

  1. Appium Android Bootstrap源码分析之控件AndroidElement

    通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...

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

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

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

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

  4. Duilib源码分析(一)整体框架

    Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...

  5. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  6. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  7. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  8. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  9. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

随机推荐

  1. Python Day18

    WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 Web请求流程 -- 原始Web ...

  2. HTTP 基础知识

    HTTP是一种协议.HTTP使用流程,一般情况下, 第一:由HTTP客户端发出请求,创建端口. 第二:HTTP服务器在端口监听客户端的请求. 第三:一旦收到请求,HTTP服务器向客户端返回状态和内容. ...

  3. Java Annotation概述

    @(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...

  4. AVL树

    AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...

  5. VBA学习

    1. Range / Cells / Columns / Rows 2. 绝对引用 $F$13 / 相对引用 F13 公式所在单元格的被复制到其他位置时,绝对引用不变 3. VLookup / NLo ...

  6. python版本随意切换之python2.7+django1.8.7+uwsgi+nginx源码包部署。

    资源准备: wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz wget https://www.djangoproject ...

  7. UnixBench-linux下的跑分软件

    UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具.UnixBench会执行一系列的测试,包括2D和3D图形系统的性能,测试的结果不仅仅是CPU,内存, ...

  8. Func

    Func<List<int>, string> getStr = (list) => { var returnStr = ""; if (list.A ...

  9. c#过滤html标签

    public string HtmlFilter(string html)     {         //设置要删除的标记         string[] lable = { "font ...

  10. 常用vim插件的安装、使用和管理

      1.Ctags Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或者其他工具用来快速查找定位源代码中的符号,入变量名,函数名等.比如,tags文件就是Taglist和 ...