要学习该控件得先去看duilib的demo里面的ListDemo
ListMainForm
1、该类继承了IListCallbackUI接口,并实现了对应的LPCTSTR GetItemText(CControlUI* pControl, int iIndex, int iSubItem)回调函数。
在CListTextElementUI函数中的DrawItemText调用了该函数来获取对应的item的值。pControl 是对应的ClistLabelElementUI指针,iIndex则是对应的是该pControl在数组中对应第几行。iSubItem就是对应的第几列。
当然:如果没有使用该函数,则可以使用else strText.Assign(GetText(i));进行函数操作。如果使用else则无法对当前的数据进行diy,只能使用默认的数据。
2、CListUI 继承了CVerticalLayout,主要是为了进行对应的滚动条的操作。因为滚动条是为了用在CListBodyUI:该类保存了所有的element。并使用了Expand来判断是否将该行显示出来。这个很有利于重绘树形控件。具体重绘树形控件可以看GameDemo。
3、CListUI最主要的属性是CListBodyUI* m_pList; 实现了主要的Item操作的功能。
回到ListMainForm类
该类的List的xml控件(这里删去一些)
<List name="domainlist" menu="true"> <ListHeader height="24" menu="true"> <ListHeaderItem sepwidth="1"/> <ListHeaderItem sepwidth="1"/> </ListHeader>
这里我标注了两个地方的menu,其实只有List起作用,另外的位置不起作用。因为它的子控件均属于该大框架。当右击List范围内的时候就会响应对应的WM_CONTEXTMENU中调用CControl的DoEvent 中的UIEVENT_CONTEXTMENU 。
4、当很疑惑为什么添加一个Element的时候会马上显示。其实在Add或者erase的时候均会调用NeedUpdate.来进行相应的更新。