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