duilib库之前也用过一段时间了,但是对于其机制老是模糊不清,所以现在应用起来也是不太顺畅,所以自定义一个list也是花费很长时间,看来记录的确很重要了。
下面仿照duilib给出的实例,来自定义列表
大概思路都是自定义CListContainerElementUI作为列表项,然后加载xml文件,每添加一项列表项,就加一条记录。
列表项如下:<?xml version="1.0" encoding="UTF-8"?>
<Window>
<Font id="0" name="微软雅黑" size="9" bold="false" />
<ListContainerElement>
<HorizontalLayout height="55">
<VerticalLayout name="logo_container" width="48">
<Button name="logo" width="32" height="32" bkimage="man.png"/>
<Label name="ccNumber" text="TJ1985" font="0"/>
</VerticalLayout>
<Control width="22" />
<VerticalLayout >
<HorizontalLayout>
<Label name="nickname" text="胖达熊猫" bordersize="0" width="60" textcolor="#FF808080" disabledtextcolor="#FF808080" font="0"/>
<Label name="timeDuration" bordersize="0" text="2019-5-6 11:15:25" textcolor="#FF808080" font="0"/>
</HorizontalLayout>
<HorizontalLayout>
<Button name="recordbtn" width="100" height="24" bkimage="file='voice_play_button_3.png' dest='0,3,18,19' source='0,0,18,16'" font="0" bkcolor="#ffedf2f4" text="00:10:30"/>
<Control width="10"/>
<VerticalLayout>
<Control height="5"/>
<Label name="unreadMsg" bkimage="map_dot.png" width="14" height="14"/>
</VerticalLayout>
</HorizontalLayout>
</VerticalLayout>
</HorizontalLayout>
</ListContainerElement>
</Window>
这是列表项配置的xml文件了,然后自定义列表从CListUI中继承其属性,添加列表项即可
struct MessageListItem
{
bool folder;
bool empty;
CDuiString id;
CDuiString logo;
CDuiString nick_name;
CDuiString description;
CDuiString during;
};
void AddNode(const MessageListItem& item)
{
TCHAR szBuf[MAX_PATH] = { 0 };
CListContainerElementUI* pListElement = NULL;
if (!m_dlgBuilder.GetMarkup()->IsValid()) {
pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilder.Create(_T("msg_list_item.xml"), (UINT)0, NULL, &paint_manager_));
}
else {
pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilder.Create((UINT)0, &paint_manager_));
}
if (pListElement == NULL)
return;
CButtonUI* log_button = static_cast<CButtonUI*>(paint_manager_.FindSubControlByName(pListElement, kLogoButtonControlName));
CLabelUI *log_ccNumber = static_cast<CLabelUI *>(paint_manager_.FindSubControlByName(pListElement, _T("ccNumber")));
if (log_button != NULL)
{
if (!item.folder && !item.logo.IsEmpty())
{
_stprintf_s(szBuf, MAX_PATH - 1, _T("%s"), item.logo);
log_button->SetNormalImage(szBuf);
}
else
{
CContainerUI* logo_container = static_cast<CContainerUI*>(paint_manager_.FindSubControlByName(pListElement, kLogoContainerControlName));
if (logo_container != NULL)
logo_container->SetVisible(false);
}
log_button->SetTag((UINT_PTR)pListElement);
log_ccNumber->SetText(item.id);
log_button->OnEvent += MakeDelegate(&OnLogoButtonEvent);
}
CDuiString html_text;
CLabelUI* nick_name = static_cast<CLabelUI*>(paint_manager_.FindSubControlByName(pListElement, kNickNameControlName));
if (nick_name != NULL)
{
if (item.folder)
nick_name->SetFixedWidth(0);
nick_name->SetShowHtml(true);
nick_name->SetText(item.nick_name);
}
if (!item.folder && !item.description.IsEmpty())
{
CLabelUI* description = static_cast<CLabelUI*>(paint_manager_.FindSubControlByName(pListElement, _T("timeDuration")));
if (description != NULL)
{
_stprintf_s(szBuf, MAX_PATH - 1, _T("<x 20><c #808080>%s</c>"), item.description);
description->SetShowHtml(true);
description->SetText(szBuf);
}
}
CButtonUI *recordbtn = static_cast<CButtonUI *>(paint_manager_.FindSubControlByName(pListElement,_T("recordbtn")));
recordbtn->OnEvent += MakeDelegate(&OnLogoButtonEvent);
recordbtn->SetFixedWidth(100);
recordbtn->SetText(item.during);
pListElement->SetFixedHeight(kGroupListItemNormalHeight);
int index = 0;
if (!CListUI::AddAt(pListElement, index))
{
delete pListElement;
}
return;
}
一个简单的列表项就是这么简单了。