bool CUIComboBox::Activate() { if( !CUIControl::Activate() ) return false; m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED; if (m_pWindow) return true; m_pWindow = new CUIComboBoxWnd; SIZE szAvailable = { 0, 30 }; m_szDropBox.cy = 0; for( int i = 0; i < m_items.GetSize(); i++ ) { CUIControl* pControl = static_cast<CUIControl*>(m_items[i]); if (pControl) { SIZE size = pControl->EstimateSize(szAvailable); if (m_nItemHeight < size.cy) { m_szDropBox.cy += size.cy; } else { m_szDropBox.cy += m_nItemHeight; CUIListLabelElement* pLabel = dynamic_cast<CUIListLabelElement*>(pControl); if (pLabel) { pLabel->SetHeight(m_nItemHeight); } } } } m_szDropBox.cy += 6; if (m_szDropBox.cy > m_nDropBoxHeight) { m_szDropBox.cy = m_nDropBoxHeight; m_bIsHasVScroll = true; } m_pWindow->Init(this); if( m_pManager != NULL ) m_pManager->SendNotify(this, UI_NOTIFY_DROPDOWN); 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); }