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

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

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

  1. <List name="list_data" float="true" pos="0,10,0,0" width="615" height="280" header="hidden" itemlinecolor="FFB8BDC6" vscrollbar="true" bkcolor="#FFE6ECF7" >
  2. <ListContainerElement name="menu_Open" height="22" inset="40,0,0,0">
  3. <Label text="打开" mouse="false"/>
  4. </ListContainerElement>
  5. <ListContainerElement name="menu_Mark" height="22" inset="40,0,0,0">
  6. <Label text="标注" mouse="false"/>
  7. </ListContainerElement>
  8. <ListContainerElement name="menu_Delete" height="22" inset="40,0,0,0">
  9. <Label text="删除" mouse="false"/>
  10. </ListContainerElement>
  11. </List>

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

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

  1. <List name="list_data" float="true" pos="0,10,0,0" width="615" height="280" header="hidden" itemlinecolor="FFB8BDC6" vscrollbar="true" bkcolor="#FFE6ECF7" >
  2.  
  3. </List>

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Window size="1820,701" caption="0,0,0,701">
  3. <ListContainerElement name="display_camera_preset_item" height="38" minheight="38">
  4. <HorizontalLayout>
  5. <Control width="20"/>
  6. <Label name="number_lab" width="50" text="136" textcolor="FF6B6B6B" />
  7. <VerticalLayout >
  8. <HorizontalLayout />
  9. <Label name="name_lab" width="156" text="test" align="left" textpadding="10,4,0,0" textcolor="#FF000000" disabledtextcolor="#FF808080" />
  10. <HorizontalLayout />
  11. </VerticalLayout>
  12. </HorizontalLayout>
  13. </ListContainerElement>
  14. </Window>

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

  1. CDialogBuilder builder;
  2. if(!builder.GetMarkup()->IsValid())
  3. pEle = static_cast<CListContainerElementUI *>(builder.Create(_T("list_item.xml"),(UINT),this,&m_PaintManager));
  4. else
  5. pEle = static_cast<CListContainerElementUI*>(builder.Create(this,&m_PaintManager));
  6.  
  7. pEle->SetMinHeight();
  8. CLabelUI *pLab = static_cast<CLabelUI *>(pEle->FindSubControl(_T("number_lab")));
  9. pLab->SetText(_T(""));
  10. pLab = static_cast<CLabelUI *>(pEle->FindSubControl(_T("name_lab")));
  11. pLab->SetText(_T("ko"));
  12. CListUI *pList = static_cast<CListUI*>(m_PaintManager.FindControl(_T("list_data")));
  13. if(NULL == pList)
  14. return;
  15. pList->Add(pEle);

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

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

  1. <List name="list_data" bkcolor="#FFFFFFFF" inset="0,0,0,0" bordersize="1" bordercolor="#FFD7D7D7" itemshowhtml="true" vscrollbar="true" hscrollbar="true" itemalign="left" itemaltbk="true" itemshowrowline="true" itemshowcolumnline="true" itemlinecolor="#FFD7D7D7">
  2. <ListHeader height="40" bkcolor="#FFE6ECF7" bordersize="1" bordercolor="#FFD7D7D7">
  3. <ListHeaderItem text="序号" name="es_header_name_dbclick" width="350" align="left" textpadding="15,0,0,0" />
  4. <Control width="1" bkcolor="#FFD7D7D7"/>
  5. <ListHeaderItem text="名称" name="es_header_username_dbclick" width="350" align="left" textpadding="15,0,0,0" />
  6. <Control width="1" bkcolor="#FFD7D7D7"/>
  7. </ListHeader>
  8. </List>

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

对应的元素XML如下:

  1. <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  2. <Window size="1740,900" >
  3. <ListContainerElement height="40" >
  4. <!--序号-->
  5. <VerticalLayout width="109" height="40" >
  6. <Label name="number_lab" textpadding="15,0,0,0" font="6" valign="center" height="40" textcolor="#FF5E5E5E" disabledtextcolor="#FFA7A6AA" />
  7. </VerticalLayout>
  8. <Control width="1" bkcolor="#FFCACACA"/>
  9. <!--名称-->
  10. <VerticalLayout width="149" height="40" >
  11. <Label name="name_lab" textpadding="15,0,0,0" font="6" valign="center" height="40" textcolor="#FF5E5E5E" disabledtextcolor="#FFA7A6AA" />
  12. </VerticalLayout>
  13. </ListContainerElement>
  14. </Window>

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

  1. # if
  2. void CListContainerElementUI::SetPos( RECT rc, bool bNeedInvalidate /*= true*/ )
  3. {
  4. __super::SetPos(rc,bNeedInvalidate);
  5.  
  6. #if 1
  7. if(GetOwner()->GetListInfo()->nColumns > )
  8. {
  9.  
  10. rc = m_rcItem;
  11.  
  12. // Adjust for inset
  13. rc.left += m_rcInset.left;
  14. rc.top += m_rcInset.top;
  15. rc.right -= m_rcInset.right;
  16. rc.bottom -= m_rcInset.bottom;
  17.  
  18. TListInfoUI *plistinfo = GetOwner()->GetListInfo();
  19.  
  20. // Determine the width of elements that are sizeable
  21. SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
  22.  
  23. for( int it2 = ; it2 < m_items.GetSize(); it2++ )
  24. {
  25. CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
  26. if( !pControl->IsVisible() )
  27. continue;
  28. if( pControl->IsFloat() )
  29. {
  30. SetFloatPos(it2);
  31. continue;
  32. }
  33. RECT rcPadding = pControl->GetPadding();
  34. SIZE sz = pControl->EstimateSize(szAvailable);
  35. // if( sz.cx == 0 )
  36. // {
  37. if( sz.cx < pControl->GetMinWidth() )
  38. sz.cx = pControl->GetMinWidth();
  39. if( sz.cx > pControl->GetMaxWidth() )
  40. sz.cx = pControl->GetMaxWidth();
  41. // }
  42. // else
  43. // {
  44. // if( sz.cx < pControl->GetMinWidth() )
  45. // sz.cx = pControl->GetMinWidth();
  46. // if( sz.cx > pControl->GetMaxWidth() )
  47. // sz.cx = pControl->GetMaxWidth();
  48. // }
  49.  
  50. sz.cy = pControl->GetFixedHeight();
  51. if( sz.cy == )
  52. sz.cy = rc.bottom - rc.top - rcPadding.top - rcPadding.bottom;
  53. if( sz.cy < )
  54. sz.cy = ;
  55. if( sz.cy < pControl->GetMinHeight() )
  56. sz.cy = pControl->GetMinHeight();
  57. if( sz.cy > pControl->GetMaxHeight() )
  58. sz.cy = pControl->GetMaxHeight();
  59.  
  60. RECT rcCtrl = { plistinfo->rcColumn[it2].left + rcPadding.left,
  61. rc.top + rcPadding.top,
  62. plistinfo->rcColumn[it2].right + rcPadding.left,
  63. rc.top + sz.cy + rcPadding.top + rcPadding.bottom };
  64. pControl->SetPos(rcCtrl);
  65. }
  66.  
  67. }
  68. #endif
  69. }
  70. #endif

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

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

duilib 之 List控件的更多相关文章

  1. 改进duilib的richedit控件的部分功能

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41208207 如果要使用透明异形窗体功能,首先要改进duilib库让他本 ...

  2. duilib修复ActiveXUI控件bug,以支持flash透明动态背景

    转载请说明原出处,谢谢~~ 昨天在QQ控件里和同学说起QQ2013登陆窗体的开发,从界面角度考虑,单单一个登陆界面是很容易做出来的.腾讯公司为了 防止各种盗号行为可谓煞费苦心,QQ2013采用了动态背 ...

  3. 将webkit内核封装为duilib的浏览器控件

    转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...

  4. duilib 绘制IP控件

    在使用duilib时,发现本来的库并没有提供IP控件,如是自己想到绘制IP控件,控件的绘制不难,首先赋值UIEdit的两个文件,命名为UIIPEdit,更改完成后,便可以进行修改绘制IP控件. 绘制难 ...

  5. duilib 增加gif控件(基于gdi+,可控制播放暂停,自动设置大小)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42502081 因为项目需要我需要给duilib增加一个gif控件,目前已 ...

  6. duilib 修复Text控件无法设置宽度的bug,增加自动加算宽度的属性

    转载请说明原出处,谢谢~~: 今天有朋友反映CTextUI控件无法设置宽度,于是修复了这个bug,顺便给Text控件增加了一个自动计算宽度的属性,描述如下 <Attribute name=&qu ...

  7. Duilib教程-控件练习

    一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为 ...

  8. DuiLib 自定义识别控件

    遇到一个断点无法识别自定义的控件,运气比较好,一搜就搜出来了: 参考地址:http://www.bkjia.com/ASPjc/992050.html 主要是这个函数: CControlUI* CDi ...

  9. Duilib实现GroupBox控件

    转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是 ...

  10. 修复duilib库UISlider控件的4个bug

    转载级请注明原出处,谢谢~· 昨天封装好一个音频类,我在为dulib做音频播放demo时发现了一些问题,由CSliderUI控件导致的,进而发现了这个控件的好几样不足,他无法满 足我们做一个播放器的进 ...

随机推荐

  1. 自定义Toast排队重复显示问题:

    原文 http://blog.csdn.net/baiyuliang2013/article/details/38655495Toast是安卓系统中,用户误操作时或某功能执行完毕时,对用户的一种提示, ...

  2. redis 初识与安装

    一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的values类型相对更多,包括字符串.列表.哈希散列表.集合,有序集合. 这些数据类型都支持pus ...

  3. python爬虫处理在线预览的pdf文档

    引言 最近在爬一个网站,然后爬到详情页的时候发现,目标内容是用pdf在线预览的 比如如下网站: https://camelot-py.readthedocs.io/en/master/_static/ ...

  4. requests---requests封装请求类型

    我们在做自动化的时候,肯定是代码越简洁越好,代码重复量越少越好,这里呢,我们可以通过把requests的请求类型都封装起来,这样编写用例的时候可以直接进行请求 requests方法封装 我们通常用的最 ...

  5. VOC2012数据集提取自己需要的类的图片和对应的xml标签

    根据需要修改路径和自己需要的类即可. import os import os.path import shutil fileDir_ann = r'/home/somnus/tttt/VOC2012/ ...

  6. HDU 5524:Subtrees

    Subtrees  Accepts: 60  Submissions: 170  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 13107 ...

  7. OpenCV数字识别

    输入命令: conda install opencv 返回信息:

  8. mycat 主从复制,读写分离,

    1.mycat 主从复制 https://blog.csdn.net/qq_35992900/article/details/80599976 2.mycat 读写分离 https://blog.cs ...

  9. [Hello 2020] C. New Year and Permutation (组合数学)

    [Hello 2020] C. New Year and Permutation (组合数学) C. New Year and Permutation time limit per test 1 se ...

  10. 「CF600E」Lomsat gelral

    传送门 Luogu 解题思路 线段树合并板子题(也可以 dsu on the tree) 好像没什么好讲的,就是要注意开 long long . 细节注意事项 咕咕咕 参考代码 #include &l ...