在《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(); }