duilib 實現 XML重用(item完全重合的CList)
最近做一個項目,界面庫用的是duilib。
軟件首頁的左側是一個機型列表,右側是機型信息及其他信息,點擊左側的機型,右邊跟著變為對應的信息。
由於右側信息比較復雜,還有進度條什麽的,所以如果右側只用一個界面,切換機型時,緩存和重新填充這些信息非常麻煩。
所以就想到了,右側使用與左側機型一樣多的界面,每個機型對應一個界面。左側切換機型時,右側只顯示其對應的界面,其他界面隱藏。
但右側的界面完全一致,即XML完全一致,且左側機型數量不確定,不可能使用TabLayout控件。
並且如果一個XML被多次include,控件name重復,會導致右側的所有界面都顯示不了。
最終考慮使用CList,只不過這個list的所有item的位置是一樣的,即item都完全重合在一起。
具體做法是:從CList派生一個CMyList,然後重寫SetPos函數,
關鍵代碼:
void CMyList::SetPos(RECT rc)
{
CVerticalLayoutUI::SetPos(rc);
for (int it2 = 0; it2 < m_items.GetSize(); it2++)
{
CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
if(pControl) pControl->SetPos(m_rcItem);
}
}
CMainWnd::CreateControl 函數中添加:
if (_tcscmp(pstrClass, _T("MyList")) == 0)
{
pControl = new CMyList;
}
在切換界面時,只顯示CMyList對應的ITEM,其他item隱藏;
其他用法與CList完全一致。
如此以來,界面處理上簡易了非常多,切換界面時不用去考慮界面上控件的內容,不用緩存,不用重新設置。。。
duilib 實現 XML重用(item完全重合的CList)