首先请大家看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控件的一个问题修复。