在《duilib進階教程 -- TreeView控件的bug (9)》裏,Alberl發現了兩個bug,並解決了其中一個,如今教程已經接近尾聲啦,因此Alberl就解決了另一個bug。html
Bug現象:函數
第一次啓動軟件時,因爲播放列表並無文件,因此沒有顯示垂直滾動條,當咱們拖入文件後,就顯示了垂直滾動條,這個時候會自動調整子控件的寬度,因而一切顯示正常。ui
可是當咱們第二次啓動軟件時,因爲軟件會加載文件到播放列表,因此一開始就顯示了垂直滾動條,但這個時候並無自動調整子控件的寬度,因此子控件顯示到了列表的外面,如圖:this
其實不只TreeView有問題,並且List也有問題,用以下代碼spa
啓動時,效果如圖:code
最小化一次後,效果如圖:htm
緣由:blog
其實這是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(); }