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

  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. C++重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  2. MySQL点滴

    1. 只安装Server和Workbench即可: 2. 安装时安装Windows服务,可以在“管理 > 服务”中开启关闭服务: 3. mysql -uroot -p1234 4. PHP Fa ...

  3. Node.js之路【第一篇】初识Node.js

    什么是Node.js 1.Node.js就是运行在服务端的JavaScrip. 2.Node.js是一个基于Chrome JavaScrip运行时简历的一个平台. 3.Node.js是一个非阻塞I/O ...

  4. PHP判断sql语句是否执行成功

    关于这个问题的分析: 1. 这个SQL 语法是否错误? 2. 如果没错SQL是否对数据库影响了? 综上改为以下代码: $query = mysql_query("delete from `y ...

  5. Mysql中sql_mode详解

    阅读目录 简介 sql_mode常用值 session与global 简介 MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式.这样,应用程序就能对服务器操作进 ...

  6. Linux安装ftp组件过程

    1   安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. [root@bogon ~]# yum -y install vsftpd 2 ...

  7. 静态界面传值javascript

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm 复制代码代码如下: <input type="text" n ...

  8. js精简写倒计时函数

    <div class="fRight mR10" id="time"> </div> <script type="tex ...

  9. IE浏览器下异步请求的缓存问题

    问题: 在做即时通讯时,需要提示用户有几条未读的提醒,这个是(如果有新的提示消息立马在浏览器无刷新提示)即时获取的.但我们的做法是,当用户点击未读信息进入到信息显示页面时重新获取下未读的提醒:但是在I ...

  10. codeblocks16.01 中配置Opencv3 姿势

    VS太大安装时间长,考虑到效率问题,可以使用opencv+codeblocks opencv3没有codeblocks版本,需要自己编译,编译过程略. 已编译版本下载地址 http://pan.bai ...