在《duilib進階教程 -- TreeView控件的bug (9)》里,Alberl發現了兩個bug,並解決了其中一個,現在教程已經接近尾聲啦,所以Alberl就解決了另外一個bug。
Bug現象:
第一次啟動軟件時,由於播放列表並沒有文件,所以沒有顯示垂直滾動條,當我們拖入文件后,就顯示了垂直滾動條,這個時候會自動調整子控件的寬度,於是一切顯示正常。
但是當我們第二次啟動軟件時,由於軟件會加載文件到播放列表,所以一開始就顯示了垂直滾動條,但這個時候並沒有自動調整子控件的寬度,所以子控件顯示到了列表的外面,如圖:
其實不僅TreeView有問題,而且List也有問題,用如下代碼
啟動時,效果如圖:
最小化一次后,效果如圖:
原因:
其實這是Container的bug,而List繼承於Container,Tree繼承於List,所以凡是繼承於Container的控件都有這個bug。因為剛啟動時,滾動條Visible的初始狀態是true,刷新一次后,Container才發現無需顯示水平滾動條,然后才調整子控件的寬度。
解決方法:
讓滾動條的初始狀態為隱藏狀態就行了,即在CContainerUI::EnableScrollBar函數里新建滾動條的時候,加上SetVisible(false);完整代碼如下:
void CContainerUI::EnableScrollBar(bool bEnableVertical, bool bEnableHorizontal) { if( bEnableVertical && !m_pVerticalScrollBar ) { m_pVerticalScrollBar = new CScrollBarUI; m_pVerticalScrollBar->SetOwner(this); m_pVerticalScrollBar->SetManager(m_pManager, NULL, false); m_pVerticalScrollBar->SetVisible(false); // 這里添加 if ( m_pManager ) { LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("VScrollBar")); if( pDefaultAttributes ) { m_pVerticalScrollBar->ApplyAttributeList(pDefaultAttributes); } } } else if( !bEnableVertical && m_pVerticalScrollBar ) { delete m_pVerticalScrollBar; m_pVerticalScrollBar = NULL; } if( bEnableHorizontal && !m_pHorizontalScrollBar ) { m_pHorizontalScrollBar = new CScrollBarUI; m_pHorizontalScrollBar->SetHorizontal(true); m_pHorizontalScrollBar->SetOwner(this); m_pHorizontalScrollBar->SetManager(m_pManager, NULL, false); m_pHorizontalScrollBar->SetVisible(false); // 這里添加 if ( m_pManager ) { LPCTSTR pDefaultAttributes = m_pManager->GetDefaultAttributeList(_T("HScrollBar")); if( pDefaultAttributes ) { m_pHorizontalScrollBar->ApplyAttributeList(pDefaultAttributes); } } } else if( !bEnableHorizontal && m_pHorizontalScrollBar ) { delete m_pHorizontalScrollBar; m_pHorizontalScrollBar = NULL; } NeedUpdate(); }