duilib 之 List控件
阅读原文时间:2023年07月12日阅读:1

  List控件是我们常用到的控件,也是应用很广泛。

对LIST控件添加元素有两种方法,一种是直接在XML中写死元素,另一种是动态创建。另外,LIST的应用也分为两种,一种需要表头,另一种是不需要表头。对应带表头的LIST,还会分为可拖动表头,和不可拖动表头,以下将会一一举例说明。

先看在XML中添加元素,格式如下:

  这样就插入了三行到List中。

  对于动态添加元素,只需要动态创建元素,然后插入到LIST中,对应的XML如下:

    <List name="list\_data"  float="true" pos="0,10,0,0"  width="615" height="280"  header="hidden" itemlinecolor="FFB8BDC6" vscrollbar="true" bkcolor="#FFE6ECF7" >

    </List>

  对应的元素XML如下,可在XML中添加任意控件,就能在LIST显示所添加的控件:


在初始化函数中,添加如下代码:

CDialogBuilder builder;  
if(!builder.GetMarkup()->IsValid())  
    pEle = static\_cast<CListContainerElementUI \*>(builder.Create(\_T("list\_item.xml"),(UINT),this,&m\_PaintManager));  
else  
    pEle = static\_cast<CListContainerElementUI\*>(builder.Create(this,&m\_PaintManager));

pEle->SetMinHeight();  
 CLabelUI \*pLab = static\_cast<CLabelUI \*>(pEle->FindSubControl(\_T("number\_lab")));  
pLab->SetText(\_T(""));  
pLab = static\_cast<CLabelUI \*>(pEle->FindSubControl(\_T("name\_lab")));  
pLab->SetText(\_T("ko"));  
 CListUI \*pList = static\_cast<CListUI\*>(m\_PaintManager.FindControl(\_T("list\_data")));  
 if(NULL == pList)  
     return;  
pList->Add(pEle);

添加完成后,就插入元素到LIST中。

对应带表头的XML,先说说可拖动的表头,默认情况下,表头是可以拖动的,XML如下:

此时创建出来的表头是可以拖动的,如果不需拖动,需在ListHeaderItem中加入属性dragable="false",这样,表头就不能拖动。

对应的元素XML如下:


  如是,我们动态创建元素,插入LIST中。但是我们发现,插入后元素布局发生了变化,而且拖延表头时,元素不跟着拖动。此时,遇到这种情况,我们需要在ListContainerElement中重写SetPos,并添加如下代码:

# if
void CListContainerElementUI::SetPos( RECT rc, bool bNeedInvalidate /*= true*/ )
{
__super::SetPos(rc,bNeedInvalidate);

#if 1
if(GetOwner()->GetListInfo()->nColumns > )
{

rc = m\_rcItem;  

// Adjust for inset  
rc.left += m\_rcInset.left;  
rc.top += m\_rcInset.top;  
rc.right -= m\_rcInset.right;  
rc.bottom -= m\_rcInset.bottom;  

TListInfoUI \*plistinfo = GetOwner()->GetListInfo();  

// Determine the width of elements that are sizeable  
SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };  

for( int it2 = ; it2 < m\_items.GetSize(); it2++ )  
{  
    CControlUI\* pControl = static\_cast<CControlUI\*>(m\_items\[it2\]);  
    if( !pControl->IsVisible() )  
        continue;  
    if( pControl->IsFloat() )  
    {  
        SetFloatPos(it2);  
        continue;  
    }  
    RECT rcPadding = pControl->GetPadding();  
    SIZE sz = pControl->EstimateSize(szAvailable);  

// if( sz.cx == 0 )
// {
if( sz.cx < pControl->GetMinWidth() )
sz.cx = pControl->GetMinWidth();
if( sz.cx > pControl->GetMaxWidth() )
sz.cx = pControl->GetMaxWidth();
// }
// else
// {
// if( sz.cx < pControl->GetMinWidth() )
// sz.cx = pControl->GetMinWidth();
// if( sz.cx > pControl->GetMaxWidth() )
// sz.cx = pControl->GetMaxWidth();
// }

    sz.cy = pControl->GetFixedHeight();  
    if( sz.cy ==  )  
        sz.cy = rc.bottom - rc.top - rcPadding.top - rcPadding.bottom;  
    if( sz.cy <  )  
        sz.cy = ;  
    if( sz.cy < pControl->GetMinHeight() )  
        sz.cy = pControl->GetMinHeight();  
    if( sz.cy > pControl->GetMaxHeight() )  
        sz.cy = pControl->GetMaxHeight();  

    RECT rcCtrl = { plistinfo->rcColumn\[it2\].left + rcPadding.left,  
        rc.top + rcPadding.top,  
        plistinfo->rcColumn\[it2\].right + rcPadding.left,  
        rc.top + sz.cy + rcPadding.top + rcPadding.bottom };  
    pControl->SetPos(rcCtrl);  
}

}  

#endif
}
#endif

到此,我们就制作出了带表头,可拖动的LIST。,效果如下图:

PS:多说一句,制作出了带表头的LIST,那我们如何响应表头消息勒?其实很简单,修改CListHeaderItemUI中的DoEvent函数,在响应UIEVENT_BUTTONDOWN或UIEVENT_DBLCLICK事件时候,将响应消息SendNotify出来就行!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章