duilib 给List表头增加百分比控制宽度的功能
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42503147
最近项目里需要用到包含表头列表,而窗体大小改变后,每个列表项的宽度不会自动改变,这样窗体变宽后列表就出现了一大片空白,非常难看。所以给列表头增加了属性,可以控制让每个列表项的宽度根据百分比来计算。这样再配合我之前写的对List控件的增强代码,就能让列表项的每列按照百分比控制宽度。
分别要给CListHeaderUI类和CListHeaderItemUI类增加函数和属性。
给CListHeaderUI增加scaleheader属性,只有scaleheader为真时才开启百分比功能,否则还是根据width属性来控制宽度
- <Attribute name="scaleheader" default="false" type="BOOL" comment="每个表头的宽度是否按照百分比来设置"/>
给CListHeaderItemUI增加scale属性,设置本子表头的宽度百分比
- <Attribute name="scale" default="0" type="INT" comment="设置子表头所占总表头的百分比宽度,如40(代表占40%的宽度)"/>
给CListHeaderItemUI增加属性的代码很简单,我就不贴了。给CListHeaderUI控件增加SetPos成员函数,写入如下代码,加入百分比功能。
- void CListHeaderUI::SetPos(RECT rc)
- {
- CControlUI::SetPos(rc);
- 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;
- if( m_items.GetSize() == 0) {
- return;
- }
- // Determine the width of elements that are sizeable
- SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
- int nAdjustables = 0;
- int cxFixed = 0;
- int nEstimateNum = 0;
- for( int it1 = 0; it1 < m_items.GetSize(); it1++ ) {
- CControlUI* pControl = static_cast<CControlUI*>(m_items[it1]);
- if( !pControl->IsVisible() ) continue;
- if( pControl->IsFloat() ) continue;
- SIZE sz = pControl->EstimateSize(szAvailable);
- if( sz.cx == 0 ) {
- nAdjustables++;
- }
- else {
- if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth();
- if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth();
- }
- cxFixed += sz.cx + pControl->GetPadding().left + pControl->GetPadding().right;
- nEstimateNum++;
- }
- cxFixed += (nEstimateNum - 1) * m_iChildPadding;
- int cxExpand = 0;
- int cxNeeded = 0;
- if( nAdjustables > 0 ) cxExpand = MAX(0, (szAvailable.cx - cxFixed) / nAdjustables);
- // Position the elements
- SIZE szRemaining = szAvailable;
- int iPosX = rc.left;
- int iAdjustable = 0;
- int cxFixedRemaining = cxFixed;
- for( int it2 = 0; 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();
- szRemaining.cx -= rcPadding.left;
- SIZE sz = {0,0};
- if (m_bIsScaleHeader)
- {
- CListHeaderItemUI* pHeaderItem = static_cast<CListHeaderItemUI*>(pControl);
- sz.cx = int(GetWidth() * (float)pHeaderItem->GetScale() / 100);
- }
- else
- {
- sz = pControl->EstimateSize(szRemaining);
- }
- if( sz.cx == 0 ) {
- iAdjustable++;
- sz.cx = cxExpand;
- // Distribute remaining to last element (usually round-off left-overs)
- if( iAdjustable == nAdjustables ) {
- sz.cx = MAX(0, szRemaining.cx - rcPadding.right - cxFixedRemaining);
- }
- 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();
- cxFixedRemaining -= sz.cx;
- }
- sz.cy = pControl->GetFixedHeight();
- if( sz.cy == 0 ) sz.cy = rc.bottom - rc.top - rcPadding.top - rcPadding.bottom;
- if( sz.cy < 0 ) sz.cy = 0;
- if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight();
- if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight();
- RECT rcCtrl = { iPosX + rcPadding.left, rc.top + rcPadding.top, iPosX + sz.cx + rcPadding.left + rcPadding.right, rc.top + rcPadding.top + sz.cy};
- pControl->SetPos(rcCtrl);
- iPosX += sz.cx + m_iChildPadding + rcPadding.left + rcPadding.right;
- cxNeeded += sz.cx + rcPadding.left + rcPadding.right;
- szRemaining.cx -= sz.cx + m_iChildPadding + rcPadding.right;
- }
- cxNeeded += (nEstimateNum - 1) * m_iChildPadding;
- }
总结:
完整的代码可以在我的库里下载到:点击打开链接
Redrain 2015.1.7
duilib 给List表头增加百分比控制宽度的功能的更多相关文章
- 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常
起因: 做项目的时候做了一个表格内容超过DIV容器自动横向滚动处理.别的浏览器都正常:但是在IE下面明明表格table和容器DIV宽度一致但是却出现了滚动条.如图 然后本人做实验找了半天原因终于是找到 ...
- Android应用--简、美音乐播放器增加音量控制
Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...
- JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客
JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379
- duilib 修复Text控件无法设置宽度的bug,增加自动加算宽度的属性
转载请说明原出处,谢谢~~: 今天有朋友反映CTextUI控件无法设置宽度,于是修复了这个bug,顺便给Text控件增加了一个自动计算宽度的属性,描述如下 <Attribute name=&qu ...
- WISE安装程序增加注册控制
我做安装程序,一直用的WISE 9.最近为一个用户提供安装程序时,公司要求对安装程序增加控制,避免用户到处安装,增加公司服务的压力.因此,我在WISE制作的安装程序中增加了注册码校验控制,不能给出正确 ...
- div设置百分比高度 宽度
给div按百分比设置高度 宽度两种方法: 第一种是给body标签设置他的高度值,xxxpx,div就会根据body的像素值取百分比: 第二种方法就是在div属性中加入 position:absolut ...
- 单点登录(十八)----cas4.2.x客户端增加权限控制shiro
我们在上面章节已经完成了cas4.2.x登录启用mongodb的验证方式. 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程 也完成了获取管理员身份属性 ...
- css中,设置百分比后,让百分比的宽度包括padding和border来计算
*{ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;}
- table无法控制宽度
table-layout:fixed
随机推荐
- 第四次ScrumMeeting博客
第四次ScrumMeeting博客 本次会议于10月28日(六)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和 ...
- 关于《数据结构》课本KMP算法的理解
数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...
- Android开发第二阶段(1)
今天:总结第一阶段的冲刺成果,第一阶段就是主要是学习andriod开发,参考文件有<黑马教学视频><Mars教学视频>...结果在看的过程遇到很多问题特别是对java的一些理解 ...
- HDU 5636 Shortest Path
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 题解: 1.暴力枚举: #include<cmath> #include<c ...
- 0527 SCRUM团队项目7.0
Sprint回顾 让我们一次比一次做得更好. 1.回顾组织 主题:“我们怎样才能在下个sprint中做的更好?” 时间:设定为1至2个小时. 参与者:整个团队. 场所:能够在不受干扰的情况下讨论. ...
- erlang node time ticket
Erlang doesn't detect net splits by itself. You could start looking atnet_kernel:set_net_ticktime/2 ...
- [2017BUAA软工]第二次博客作业:代码复审
〇.comment链接 https://github.com/hanayashiki/Sudoku/issues/1 一.代码复审 1.概要部分 (1)代码能符合需求和规格说明么? 经测试,对于合法输 ...
- kafka 基础知识梳理-kafka是一种高吞吐量的分布式发布订阅消息系统
一.kafka 简介 今社会各种应用系统诸如商业.社交.搜索.浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何及时做到如上两点 ...
- 第114天:Ajax跨域请求解决方法(二)
一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js http:// (协议号) www (子 ...
- 【开发工具IDE】解决IntelliJ IDEA 创建Maven项目速度慢的问题
方法一(推荐) 在创建Maven项目时加上 archetypeCatalog=internal 参数,如下: 方法二 在maven的VM Options加上-DarchetypeCatalog=int ...