• 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创建的工程,在整个资源解析、控件创建、控件加载与绘制,控件数据处理等管理的整个过程进行分析。

        

        

        

        

  • 相关阅读:
    挺喜欢的一幅摄影作品,不知道作者 不知道出处...
    使用触发器来监控表的使用情况
    SQL Server 针对表的只读权限分配
    tnslsnr.exe进程占用大量内存的解决.
    记录一次MYSQL的备份(浅尝辄止型)
    记录temp被撑爆的一次SQL tuning
    Bug 5880921 V$SYSMETRIC_HISTORY 的时间错乱
    sqlite3学习记录
    指针 数组指针 指针数组 函数指针等说明。
    c/c++ 运算符 优先级 结合性 记录
  • 原文地址:https://www.cnblogs.com/haomiao/p/5046578.html
Copyright © 2020-2023  润新知