duilib 自定义list(一)

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;
    }

 

一个简单的列表项就是这么简单了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值