bool CUIComboBox::SetCurSel(int iIndex) { if( iIndex == m_iCurSel ) return true; if( m_iCurSel >= 0 ) { CUIControl* pControl = static_cast<CUIControl*>(m_items[m_iCurSel]); IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem"))); if( pListItem != NULL ) pListItem->Select(false); m_iCurSel = -1; } if( m_items.GetSize() == 0 ) return false; if( iIndex < 0 ) iIndex = 0; if( iIndex >= m_items.GetSize() ) iIndex = m_items.GetSize() - 1; CUIControl* pControl = static_cast<CUIControl*>(m_items[iIndex]); if( !pControl->IsVisible() ) return false; if( !pControl->IsEnabled() ) return false; IListItemUI* pListItem = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem"))); if( pListItem == NULL ) return false; m_iCurSel = iIndex; pControl->SetFocus(); pListItem->Select(true); CUIContainer* pContainer = dynamic_cast<CUIContainer*>(pListItem->GetOwner()); if (pContainer) { RECT rcItem = pControl->GetPos(); RECT rcList = pContainer->GetPos(); int iPos = pContainer->GetScrollPos(); if( rcItem.top < rcList.top || rcItem.bottom > rcList.bottom ) { int dx = 0; if( rcItem.top < rcList.top ) dx = rcItem.top - rcList.top; if( rcItem.bottom > rcList.bottom ) dx = rcItem.bottom - rcList.bottom; pContainer->SetScrollPos(pContainer->GetScrollPos() + dx); } } Invalidate(); return true; }
void CUIVerticalLayout::SetPos(const CUIRect& rc) { CUIRect rcTemp = rc; CUIControl::SetPos(rc); rcTemp = m_rcItem; // // 调整内边距 // rcTemp.left += m_rcInset.left; rcTemp.top += m_rcInset.top; rcTemp.right -= m_rcInset.right; rcTemp.bottom -= m_rcInset.bottom; if( m_items.GetSize() == 0) { ProcessScrollBar(rcTemp, 0, 0); return; } // // 如果有滚动条,减去滚动条的宽度 // if(m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible()) rcTemp.right -= m_pVerticalScrollBar->GetFixedWidth(); if(m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible()) rcTemp.bottom -= m_pHorizontalScrollBar->GetFixedHeight(); // // Determine the minimum size // SIZE szAvailable = { rcTemp.right - rcTemp.left, rcTemp.bottom - rcTemp.top }; if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) szAvailable.cx += m_pHorizontalScrollBar->GetScrollRange(); int nAdjustables = 0; //要调整控件的个数 int cyFixed = 0; //控件固定的宽度 int nEstimateNum = 0; //调整控件的个数 for( int it1 = 0; it1 < m_items.GetSize(); it1++ ) { CUIControl* pControl = static_cast<CUIControl*>(m_items[it1]); // // 控件不可见不进行处理 // if(!pControl->IsVisible()) continue; // // 控件为float类型的不进行处理 // if(pControl->IsFloat()) continue; SIZE sz = pControl->EstimateSize(szAvailable); if(sz.cy == 0) { // // 高度等于0需要我们来计算 // nAdjustables++; }else{ // // 不能超出控件的设置的最小和最大值 // if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); } // // 加上下外边距 // cyFixed += sz.cy + pControl->GetPadding().top + pControl->GetPadding().bottom; nEstimateNum++; } // // 加上子控件之间的额外距离 // cyFixed += (nEstimateNum - 1) * m_iChildPadding; // // Place elements // int cyNeeded = 0; int cyExpand = 0; // // 计算要调整的每个控件的平均高度 // if( nAdjustables > 0 ) cyExpand = MAX(0, (szAvailable.cy - cyFixed) / nAdjustables); // // Position the elements // 减去滚动条的位置 // SIZE szRemaining = szAvailable; int iPosY = rcTemp.top; if(m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible()) { iPosY -= m_pVerticalScrollBar->GetScrollPos(); } int iPosX = rcTemp.left; if(m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible()) { iPosX -= m_pHorizontalScrollBar->GetScrollPos(); } int iAdjustable = 0; int cyFixedRemaining = cyFixed; for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) { CUIControl* pControl = static_cast<CUIControl*>(m_items[it2]); if( !pControl->IsVisible() ) continue; if( pControl->IsFloat() ) { SetFloatPos(it2); continue; } RECT rcPadding = pControl->GetPadding(); szRemaining.cy -= rcPadding.top; CUISize sz = pControl->EstimateSize(szRemaining); if(sz.cy == 0){ iAdjustable++; // // 赋平均值 // sz.cy = cyExpand; if( iAdjustable == nAdjustables ) { // // Distribute remaining to last element (usually round-off left-overs) // sz.cy = MAX(0, szRemaining.cy - rcPadding.bottom - cyFixedRemaining); } // // 不能超过控件的最大与最小值 // if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); }else{ // // 固定高度的控件 // if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); cyFixedRemaining -= sz.cy; } // // 调整宽度的值 // sz.cx = pControl->GetFixedWidth(); if( sz.cx == 0 ) sz.cx = szAvailable.cx - rcPadding.left - rcPadding.right; if( sz.cx < 0 ) sz.cx = 0; if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth(); if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth(); // // 生成并设置新的POS // CUIRect rcCtrl(iPosX + rcPadding.left, iPosY + rcPadding.top, iPosX + rcPadding.left + sz.cx, iPosY + sz.cy + rcPadding.top + rcPadding.bottom); pControl->SetPos(rcCtrl); // // 处理下ChildPadding // iPosY += sz.cy + m_iChildPadding + rcPadding.top + rcPadding.bottom; cyNeeded += sz.cy + rcPadding.top + rcPadding.bottom; szRemaining.cy -= sz.cy + m_iChildPadding + rcPadding.bottom; } cyNeeded += (nEstimateNum - 1) * m_iChildPadding; // // Process the scrollbar // ProcessScrollBar(rcTemp, 0, cyNeeded); }