Duilib源码分析(五)UI布局—Layout与各子控件
接下来,继续分析duilib之UI布局Layout,目前提供的布局有:VerticalLayout、HorizontalLayout、TileLayout、TabLayout、ChildLayout分别为垂直布局、水平布局、平铺布局、TAB布局、子窗体布局;
一般项目中用得比较多的是垂直布局、水平布局,我们将分别分析各布局;
VerticalLayout:垂直布局,继承于CContainerUI容器UI类;而CContainerUI也继承于CControlUI,故VerticalLayout实际上也是一种UI控件;
成员函数:
GetClass:获取类名称(VerticalLayoutUI);
GetInterface:获取类名下的类对象;
GetControlFlags:获取控件标记;
SetSepHeight/GetSepHeight:设置/获取分割符高度;
SetSepImmMode/IsSepImmMode:设置/获取当前拖动分隔符时,是否立即改变大小;
SetAttribute:设置指定名称的属性值;
DoEvent:事件处理函数(主要处理鼠标事件的操作);
SetPos:设置位置,调整控件位置以及滚动条;
DoPostPaint:绘制事件,用以绘制容器分割区域颜色为0xAA000000;
GetThumbRect:获取分割区域;
成员变量:
m_iSepHeight:分隔符高度;
m_uButtonState:按钮(控件)状态;
ptLastMouse:鼠标最近一次所在位置;
m_rcNewPos:控件区域位置;
m_bImmMode:是否为立即模式(立即改变大小);
HorizontalLayout:水平布局,继承于CContainerUI容器UI类;HorizontalLayout实际上也是一种UI控件;
成员函数与变量,功能描述基本上与VerticalLayout相同,只是接口SetSepWidth/GetSepWidth:设置/获取分割符宽度,另外处理DoEvent内部处理事件不同;
TileLayout:平铺布局,继承于CContainerUI容器UI类;TileLayout实际上也是一种UI控件;
成员函数:
GetClass:获取类名称(VerticalLayoutUI);
GetInterface:获取类名下的类对象;
SetAttribute:设置指定名称的属性值;
SetPos:设置位置,调整控件位置以及滚动条;
SetItemSize/GetItemSize: 设置/获取项目大小;
SetColumns/GetColumns:设置/获取列数(实时上也可由区域大小的宽度与项目大小的宽度比值得到的列数);
成员变量:
m_szItem:单个项目大小;
m_nColumns:平铺项目时的列数;
TabLayout:平铺布局,继承于CContainerUI容器UI类;TabLayout实际上也是一种UI控件;
成员函数:
GetClass:获取类名称(VerticalLayoutUI);
GetInterface:获取类名下的类对象;
SetAttribute:设置指定名称的属性值;
SetPos:设置位置,调整控件位置以及滚动条;
Add/AddAt:添加控件,或在指定位置添加控件;
Remove:移除某个指定的控件;
RemoveAll:移除所有的容器控件;
GetCurSel:获取当前控件索引;
SelectItem:以及重载版本,皆为选择指定的控件;
成员变量:
m_iCurSel:当前控件索引;
CChildLayoutUI子控件布局,继承于CContainerUI容器UI类;CChildLayoutUI实际上也是一种UI控件;
成员函数:
SetChildLayoutXML/GetChildLayoutXML:设置/获取子控件XML文件名m_pstrXMLFile;
SetAttribute:设置指定名称的属性值,当为xmlfile时,则设置子控件布局xml文件名;
GetClass:获取类名称(CChildLayoutUI);
GetInterface:获取类名下的类对象;
Init:若存在子控件xml文件,则加载并创建子控件树,并添加至本类对象容器,若创建控件失败,则移除所有容器内控件 (此做法个人觉得欠妥,因加载无效文件也会被清空早期的控件);
成员变量:
m_pstrXMLFile:子控件xml文件名;
基本上这个几个布局控件增加的接口并不多,主要提供一个控件容器和简单的布局控制;
此外以下18个控件继承关系如下:
CListUI继承于CVerticalLayoutUI,
CComboUI继承于CContainerUI,
CScrollBarUI继承于CControlUI,
CTreeViewUI继承于CListUI,
CLabelUI继承于CControlUI,
CTextUI继承于CLabelUI,
CEditUI继承于CLabelUI,
CButtonUI继承于CLabelUI,
COptionUI继承于CButtonUI,
CCheckBoxUI继承于COptionUI,
CProgressUI继承于CLabelUI,
CSliderUI继承于CProgressUI,
CComboBoxUI继承于CComboUI,
CRichEditUI继承于CContainerUI,
CDateTimeUI继承于CLabelUI,
CActiveXUI继承于CControlUI,
CWebBrowserUI继承于CActiveXUI,
CFlashUI继承于CActiveXUI。
每个控件实现自己独有的绘制、数据处理、响应方式,因比较繁琐,暂逐个不深入分析,后面可能会针对某些控件分析;
接下来,将通过实际的举例分析,duilib创建的工程,在整个资源解析、控件创建、控件加载与绘制,控件数据处理等管理的整个过程进行分析。
Duilib源码分析(五)UI布局—Layout与各子控件的更多相关文章
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Duilib源码分析(一)整体框架
Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...
- Vue系列---理解Vue.nextTick使用及源码分析(五)
_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI
接下来,分析uilib.h中的UIManager.h,在正式分析CPaintManagerUI前先了解前面的一些宏.结构: 枚举类型EVENTTYPE_UI:定义了UIManager.h中事件通告类型 ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备三)
接下来,我们将继续分析UIlib.h文件中其他的文件, UIContainer.h, UIRender.h, WinImplBase.h, UIManager.h,以及其他布局.控件等: 1. UIR ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- ABP源码分析五:ABP初始化全过程
ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下. 为个更清楚的描述其脉络,做了张流程图以辅助说明.其中每一步都涉及很多细节,难以在一张图中全部表现出来.每一步的细节(会涉及到较多接口,类 ...
- MPTCP 源码分析(五) 接收端窗口值
简述: 在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理. 接收端窗口值的初始化 ...
- vuex 源码分析(五) action 详解
action类似于mutation,不同的是Action提交的是mutation,而不是直接变更状态,而且action里可以包含任意异步操作,每个mutation的参数1是一个对象,可以包含如下六个属 ...
随机推荐
- validate表单验证插件
1.引入validate.js包 <script src="xx/xx/jquery.validate.min.js"></script> 2.表单验证 / ...
- UML大战需求分析--阅读笔记02
这次阅读了第三章--类图.本章主要讲解了类图的基本使用规则和一些使用的例子.类图是UML中非常重要的一部分,作用很大. 类图之间有五种关系:关联关系,聚合关系,组合关系,泛化关系,依赖关系.关联关系有 ...
- Windows下搭建PHP开发环境
PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...
- 使用JS,获取URL中指定参数的值
/** * 获取URL中指定参数的值 * * @param name 参数名称 * @returns */ function getQueryString(name) { var reg = new ...
- mysql5.x升级到mysql5.7后导入之前数据库date出错的快速解决方法【mysql低版本数据导入到高版本出错的解决方法】
mysql5.x升级至mysql5.7后导入之前数据库date出错,这是由于MySQL的sql_mode的影响,解决方法如下所示: [具体参考:mysql的sql_mode详解]修改mysql5.7的 ...
- js像素运算问题
通过DOM获取的某一距离属性(比如left)是带px单位的,直接对其算术运算不起效,要先把获取到的值处理一下去掉px单位. 方法一(用处理字符串的方式去除px): var x=document.get ...
- WinForm下增加声音提示
在WinForm平台下播放声音,一般有两种方式:第一种是调用系统自带声音: [代码] 申明定义: [DllImport("kernel32.dll")] public static ...
- EBS 11i 的工作流列表
总帐模块(GL) GIS(Global Intercompany System)通知 GL自动分配 GL成批分配流程 GL分配流程 GL过帐流程 GL经常性日记帐流程 PA分配组流程 日记帐审批 应付 ...
- 使用Grunt构建自动化开发环境
1.准备工作 1)首页确保电脑上网,以及能够访问https://registry.npmjs.org/,因需从此网站中下载安装相应的插件; 2)电脑安装Node.js,Grunt及Grunt插件都是基 ...
- BZOJ4591——[Shoi2015]超能粒子炮·改
1.题意:求 2.分析:公式恐惧症的同学不要跑啊QAQ 根据lucas定理-- 这一步大家都能懂吧,这是浅而易见的lucas定理转化过程,将每一项拆分成两项 那么下一步,我们将同类项合并 我们观察可以 ...