duilib list 扩展

首先请大家看http://blog.csdn.net/tragicguy/article/details/21893065这里的list实现,

这个list有个问题,不知道是不是作者故意隐藏起来,就是list加上水平滚动条后,在水平移动查看时,会发现list 中的item同步移动有问题,老是不对齐列,我的修复方法如下:

void TDListContainerElementUI::SetPos(RECT rc)

{
RECT rtPrev= GetPos();
CContainerUI::SetPos(rc);
if (m_items.GetSize() == 0 || m_pOwner == NULL || m_pListHeader==NULL)
return;

int index=0;
int nColumn = m_pListHeader->GetCount();


DUITRACE(_T("===prev==(%d,%d)"),rtPrev.left,rtPrev.right);
for (;index<nColumn;++index)
{
CControlUI* pHeaderItem = static_cast<CControlUI*>(m_pListHeader->GetItemAt(index));
if (pHeaderItem == NULL)
continue;


CControlUI* pControl = static_cast<CControlUI*>(m_items.GetAt(index));
ASSERT(pControl != NULL);


RECT rt = pHeaderItem->GetPos();
RECT rtPos = pControl->GetPos();
TListInfoUI* pListInfo = m_pOwner->GetListInfo();
RECT rtC = pListInfo->rcColumn[index];


DUITRACE(_T("===poss==(%d,%d) ==head==(%d,%d) ==Head==(%d,%d)"),
rtPos.left,rtPos.right,rt.left,rt.right,rtC.left,rtC.right);


int xInc = rtPos.left-rtPrev.left;
if (rtC.left != 0 && rtC.right !=0)
{
rt.left = rtC.left;
rt.right = rtC.right;
}


rtPos.left = rt.left+xInc+m_rcInset.left;
rtPos.right = rt.right+xInc-m_rcInset.right;
pControl->SetPos(rtPos);
}
DUITRACE(_T("\n"));
}


其中有两个注意点:

1、m_pOwner->GetListInfo();第一次返回的rtColumn宽度全部为0,是因为CListUI是调用其子控件的SetPos后才去更新它的TListInfoUI成员所致,所以需要像@TragicGuy那样处理增加m_pListHeader,否则第一次显示无法正确定位。(其实也可以在界面显示前再调用 一次CListUI::SetPos(CListUI::GetPos))(2)

2、在水平移动后,再去移动列宽度时,此时通过上面的m_pListHeader再去获取到的列表头位置都是相对值,而此时TListInfoUI成员才能正确反映列表头的位置信息。


当然上面还修复了控件对inset设置的效果。

总结:

我觉得那个m_pListHeader可以不用去增加,而采用上面(2)说的方法。这里只是针对@TragicGuy控件的一个问题修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值