duilib 给List表头增加百分比控制宽度的功能

简介: 转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42503147        最近项目里需要用到包含表头列表,而窗体大小改变后,每个列表项的宽度不会自动改变,这样窗体变宽后列表就出现了一大片空白,非常难看。

转载请说明原出处,谢谢~~: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

目录
相关文章
|
3月前
|
安全
List集合特有功能
List集合特有功能
38 2
|
6月前
使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
|
6月前
|
Python
Python list列表中每一个数字乘于2的两种多功能函数代码设计
要让Python中list列表中的每一个数字乘于2,可以有两种方法,一是使用列表推导式来完成,另一种是使用map()函数来完成。下面将通过实例代码来之一进行介绍。
145 2
|
NoSQL Java Redis
(Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
(Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
879 1
(Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
|
存储 JSON 监控
Redis - Redis List 功能详解与工业应用
Redis 列表 List 是简单的字符串列表,按照插入顺序排序,一个列表最多可以包含 232- 1 个元素 (4294967295, 每个列表超过40亿个元素)。下面介绍下 Redis List 常用功能以及在工业场景下 Redis List 的几种使用场景。......
240 0
Redis - Redis List 功能详解与工业应用
|
Java Spring
Spring注解的(List&Map)特殊注入功能
Spring注解的(List&Map)特殊注入功能
208 0
|
NoSQL Java API
Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数
1、Redis和nosql简介,api调用 14.1/ nosql介绍   NoSQL:一类新出现的数据库(not only sql),它的特点: 1、  不支持SQL语法 2、  存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 3、  NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景 4、  NoSQ
2471 0
有关MM中Source List的功能说明
MM中的Source List 在公司采购部的实际使用中有着很大的功能,用得好,可以给采购员节约PR转PO的时间.但是,如果没有用好,则会选错供应商.以下为该功能的简单说明: 1.
1069 0