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創建的工程,在整個資源解析、控件創建、控件加載與繪制,控件數據處理等管理的整個過程進行分析。

    

    

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM