转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42503147

最近项目里需要用到包含表头列表,而窗体大小改变后,每个列表项的宽度不会自动改变,这样窗体变宽后列表就出现了一大片空白,非常难看。所以给列表头增加了属性,可以控制让每个列表项的宽度根据百分比来计算。这样再配合我之前写的对List控件的增强代码,就能让列表项的每列按照百分比控制宽度。

分别要给CListHeaderUI类和CListHeaderItemUI类增加函数和属性。

给CListHeaderUI增加scaleheader属性,只有scaleheader为真时才开启百分比功能,否则还是根据width属性来控制宽度

  1. <Attribute name="scaleheader" default="false" type="BOOL" comment="每个表头的宽度是否按照百分比来设置"/>

给CListHeaderItemUI增加scale属性,设置本子表头的宽度百分比

  1. <Attribute name="scale" default="0" type="INT" comment="设置子表头所占总表头的百分比宽度,如40(代表占40%的宽度)"/>

给CListHeaderItemUI增加属性的代码很简单,我就不贴了。给CListHeaderUI控件增加SetPos成员函数,写入如下代码,加入百分比功能。

  1. void CListHeaderUI::SetPos(RECT rc)
  2. {
  3. CControlUI::SetPos(rc);
  4. rc = m_rcItem;
  5.  
  6. // Adjust for inset
  7. rc.left += m_rcInset.left;
  8. rc.top += m_rcInset.top;
  9. rc.right -= m_rcInset.right;
  10. rc.bottom -= m_rcInset.bottom;
  11.  
  12. if( m_items.GetSize() == 0) {
  13. return;
  14. }
  15.  
  16. // Determine the width of elements that are sizeable
  17. SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
  18.  
  19. int nAdjustables = 0;
  20. int cxFixed = 0;
  21. int nEstimateNum = 0;
  22. for( int it1 = 0; it1 < m_items.GetSize(); it1++ ) {
  23. CControlUI* pControl = static_cast<CControlUI*>(m_items[it1]);
  24. if( !pControl->IsVisible() ) continue;
  25. if( pControl->IsFloat() ) continue;
  26. SIZE sz = pControl->EstimateSize(szAvailable);
  27. if( sz.cx == 0 ) {
  28. nAdjustables++;
  29. }
  30. else {
  31. if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
  32. if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
  33. }
  34. cxFixed += sz.cx + pControl->GetPadding().left + pControl->GetPadding().right;
  35. nEstimateNum++;
  36. }
  37. cxFixed += (nEstimateNum - 1) * m_iChildPadding;
  38.  
  39. int cxExpand = 0;
  40. int cxNeeded = 0;
  41. if( nAdjustables > 0 ) cxExpand = MAX(0, (szAvailable.cx - cxFixed) / nAdjustables);
  42. // Position the elements
  43. SIZE szRemaining = szAvailable;
  44. int iPosX = rc.left;
  45.  
  46. int iAdjustable = 0;
  47. int cxFixedRemaining = cxFixed;
  48.  
  49. for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) {
  50. CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
  51. if( !pControl->IsVisible() ) continue;
  52. if( pControl->IsFloat() ) {
  53. SetFloatPos(it2);
  54. continue;
  55. }
  56. RECT rcPadding = pControl->GetPadding();
  57. szRemaining.cx -= rcPadding.left;
  58.  
  59. SIZE sz = {0,0};
  60. if (m_bIsScaleHeader)
  61. {
  62. CListHeaderItemUI* pHeaderItem = static_cast<CListHeaderItemUI*>(pControl);
  63. sz.cx = int(GetWidth() * (float)pHeaderItem->GetScale() / 100);
  64. }
  65. else
  66. {
  67. sz = pControl->EstimateSize(szRemaining);
  68. }
  69.  
  70. if( sz.cx == 0 ) {
  71. iAdjustable++;
  72. sz.cx = cxExpand;
  73. // Distribute remaining to last element (usually round-off left-overs)
  74. if( iAdjustable == nAdjustables ) {
  75. sz.cx = MAX(0, szRemaining.cx - rcPadding.right - cxFixedRemaining);
  76. }
  77. if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
  78. if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
  79. }
  80. else {
  81. if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
  82. if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
  83.  
  84. cxFixedRemaining -= sz.cx;
  85. }
  86.  
  87. sz.cy = pControl->GetFixedHeight();
  88. if( sz.cy == 0 ) sz.cy = rc.bottom - rc.top - rcPadding.top - rcPadding.bottom;
  89. if( sz.cy < 0 ) sz.cy = 0;
  90. if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight();
  91. if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight();
  92.  
  93. RECT rcCtrl = { iPosX + rcPadding.left, rc.top + rcPadding.top, iPosX + sz.cx + rcPadding.left + rcPadding.right, rc.top + rcPadding.top + sz.cy};
  94. pControl->SetPos(rcCtrl);
  95. iPosX += sz.cx + m_iChildPadding + rcPadding.left + rcPadding.right;
  96. cxNeeded += sz.cx + rcPadding.left + rcPadding.right;
  97. szRemaining.cx -= sz.cx + m_iChildPadding + rcPadding.right;
  98. }
  99. cxNeeded += (nEstimateNum - 1) * m_iChildPadding;
  100. }

总结:

完整的代码可以在我的库里下载到:点击打开链接

   Redrain  2015.1.7

duilib 给List表头增加百分比控制宽度的功能的更多相关文章

  1. 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常

    起因: 做项目的时候做了一个表格内容超过DIV容器自动横向滚动处理.别的浏览器都正常:但是在IE下面明明表格table和容器DIV宽度一致但是却出现了滚动条.如图 然后本人做实验找了半天原因终于是找到 ...

  2. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  3. JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客

    JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379

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

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

  5. WISE安装程序增加注册控制

    我做安装程序,一直用的WISE 9.最近为一个用户提供安装程序时,公司要求对安装程序增加控制,避免用户到处安装,增加公司服务的压力.因此,我在WISE制作的安装程序中增加了注册码校验控制,不能给出正确 ...

  6. div设置百分比高度 宽度

    给div按百分比设置高度 宽度两种方法: 第一种是给body标签设置他的高度值,xxxpx,div就会根据body的像素值取百分比: 第二种方法就是在div属性中加入 position:absolut ...

  7. 单点登录(十八)----cas4.2.x客户端增加权限控制shiro

    我们在上面章节已经完成了cas4.2.x登录启用mongodb的验证方式. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程 也完成了获取管理员身份属性 ...

  8. css中,设置百分比后,让百分比的宽度包括padding和border来计算

    *{ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;}

  9. table无法控制宽度

    table-layout:fixed

随机推荐

  1. 第四次ScrumMeeting博客

    第四次ScrumMeeting博客 本次会议于10月28日(六)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和 ...

  2. 关于《数据结构》课本KMP算法的理解

    数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...

  3. Android开发第二阶段(1)

    今天:总结第一阶段的冲刺成果,第一阶段就是主要是学习andriod开发,参考文件有<黑马教学视频><Mars教学视频>...结果在看的过程遇到很多问题特别是对java的一些理解 ...

  4. HDU 5636 Shortest Path

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 题解: 1.暴力枚举: #include<cmath> #include<c ...

  5. 0527 SCRUM团队项目7.0

    Sprint回顾 让我们一次比一次做得更好.   1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定为1至2个小时. 参与者:整个团队. 场所:能够在不受干扰的情况下讨论. ...

  6. erlang node time ticket

    Erlang doesn't detect net splits by itself. You could start looking atnet_kernel:set_net_ticktime/2 ...

  7. [2017BUAA软工]第二次博客作业:代码复审

    〇.comment链接 https://github.com/hanayashiki/Sudoku/issues/1 一.代码复审 1.概要部分 (1)代码能符合需求和规格说明么? 经测试,对于合法输 ...

  8. kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统

    一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...

  9. 第114天:Ajax跨域请求解决方法(二)

    一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js   http:// (协议号)       www  (子 ...

  10. 【开发工具IDE】解决IntelliJ IDEA 创建Maven项目速度慢的问题

    方法一(推荐) 在创建Maven项目时加上 archetypeCatalog=internal 参数,如下: 方法二 在maven的VM Options加上-DarchetypeCatalog=int ...