Example #1
0
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;
}
Example #2
0
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);
}