Duilib源码分析(二)控件构造器—CDialogBuilder
上一节了解了大体流程,但是界面控件元素是如何被加载、解析、构建、管理、控件消息如何处理的呢?接下来我们将结合控件构造器进行分析;
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的更多相关文章
- Appium Android Bootstrap源码分析之控件AndroidElement
通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- Duilib源码分析(一)整体框架
Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
随机推荐
- Html中列表标签<ul>的使用
借助Html中的列标标签<ul>在某列文字前面添加标注 <html> <head> <title>文字上方添加标记说明</title> &l ...
- mysql5.x升级到mysql5.7后导入之前数据库date出错的快速解决方法【mysql低版本数据导入到高版本出错的解决方法】
mysql5.x升级至mysql5.7后导入之前数据库date出错,这是由于MySQL的sql_mode的影响,解决方法如下所示: [具体参考:mysql的sql_mode详解]修改mysql5.7的 ...
- Androidstudio预览时出现错误java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
参考博客;http://blog.csdn.net/daqi1983/article/details/51474588 更改对应版本的SDK即可.
- RabbitMQ修改端口号和心跳时间
定读者正在Windows系列的操纵体系中装置好了Rabbit MQ后,请找到装置途径下的etc文件夹下,将rabbitmq.config.example备份一份,并点窜为config范例的文件,即为] ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
- jcFeather For Maya 2012免费版
jcFeather羽毛插件有Maya2012免费试用版. 免费版有正版的所有功能,可制作羽毛,可渲染,但是一个Maya场景文件只能有3个jcFeather 节点和3个jcPreFeather节点. j ...
- Sentiment Analysis resources
Wikipedia: Sentiment analysis (also known as opinion mining) refers to the use of natural language p ...
- GitHub上值得关注的iOS开源项目
1.AFNetworking地址:https://github.com/AFNetworking/AFNetworking用于网络请求 2.JSONKit地址:https://github.com/j ...
- 查找Linux中内存和CPU使用率最高的进程
下面的命令会查看到按照RAM和CPU降序方式的前最高几名进程的列表: [root@iZ25pvjcsyhZ ~]# ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem ...
- webstorm ES6 转 ES5
一句话总结:用WebStorm自带的File Watcher功能+Babel实现自动转换ECMAScript 6代码为ES5代码 1. 新建一个Empty Project,然后在src目录下新建了一个 ...