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 ...
随机推荐
- JMeter 分布式部署
Jmeter 是java 应用,对于CPU和内存的消耗比较大,使用单台机器模拟以千计的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误. 为了让jmeter工具提供更大的负载能力,jmeter短 ...
- [转] Windows下编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- 【转载】在IT界取得成功应该知道的10件事
在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...
- 【Make a H5 game】JS for beginner——FROM U2B
https://www.youtube.com/watch?v=F2Dc-JlwgN4&feature=iv&src_vid=WfL4LNUL3R0&annotation_id ...
- 使用pm2管理nodejs应用
PM2 is a production process manager for Node.js applications with a built-in load balancer. It allow ...
- HTML5 中的 canvas 画布(二)
绘制图片 一.绘制图片 context.drawImage()(即把图片放到canvas里) var image = new Image(); // 先创建图片对象 image.src = '图片的 ...
- rabbitmq
send端 import pika credentials = pika.PlainCredentials(') connection = pika.BlockingConnection(pika.C ...
- 得到 window.open 新页面中的数据
1.htm 页面 单击按 '钮后' 调用window.open方法,开启新窗口 2.htm 想实现---------------------- 在2.htm页面单击按钮 将相应的数据返回到 1. ...
- How do I get the path of the current executed file in Python?
First, you need to import from inspect and os from inspect import getsourcefile from os.path import ...
- 适配各种Windows分辨率,为DPI添加感知,当在高DPI时,禁用WINFORM缩放等。
因为现在高分屏越来越多,很多windows设备必须设置高DPI,这样很容易导致WINFORM整体错位,因此我们需要自己适配.禁止缩放 在程序配置清单 mainfest中添加如下. <assemb ...