void CUIComboBox::DoPaint(HDC hDC, const RECT& rcPaint) { // Paint the nice frame int cy = m_rcItem.bottom - m_rcItem.top; ::SetRect(&m_rcButton, m_rcItem.right - cy, m_rcItem.top, m_rcItem.right, m_rcItem.bottom); RECT rcText = { m_rcItem.left + 5, m_rcItem.top, m_rcButton.left + 1, m_rcItem.bottom }; UINT uState = m_uButtonState; if( IsFocused() ) uState |= UISTATE_FOCUSED; if( !IsEnabled() ) uState |= UISTATE_DISABLED; RECT rcPadding = { 0 }; // Paint dropdown button if (m_pImageOwner != NULL) { RECT rcImage = {0}; int nWidth = m_pImageOwner->GetWidth() / 4; int nHeight = m_pImageOwner->GetHeight(); // Draw frame and body if( (uState & UISTATE_DISABLED) != 0 ) { RECT rcTemp = {nWidth *3, 0, nWidth * 4, nHeight}; rcImage = rcTemp; } else if( (uState & UISTATE_PUSHED) != 0 ) { RECT rcTemp ={nWidth *2, 0, nWidth * 3, nHeight}; rcImage = rcTemp; } else if( (uState & UISTATE_HOT) != 0 ) { RECT rcTemp ={nWidth *1, 0, nWidth * 2, nHeight}; rcImage = rcTemp; } else { RECT rcTemp ={nWidth *0, 0, nWidth * 1, nHeight}; rcImage = rcTemp; } CUIBlueRenderEngine::DoFillRect(hDC, m_pManager, m_rcItem, rcImage, m_pImageOwner); } else { CUIBlueRenderEngine::DoPaintButton(hDC, m_pManager, m_rcItem, uState, NULL, 0); } if (m_sText.GetLength() > 0) { UITYPE_COLOR clrText; if( (m_uButtonState & UISTATE_DISABLED) != 0 ) { clrText = UICOLOR_BUTTON_TEXT_DISABLED; } else if( (m_uButtonState & UISTATE_PUSHED) != 0 ) { clrText = UICOLOR_BUTTON_TEXT_PUSHED; } else { clrText = UICOLOR_BUTTON_TEXT_NORMAL; } RECT rcText = m_rcItem; ::InflateRect(&rcText, -1, -1); rcText.left += rcPadding.left; rcText.top += rcPadding.top; rcText.right -= rcPadding.right; rcText.bottom -= rcPadding.bottom; int nLinks = 0; CUIBlueRenderEngine::DoPaintPrettyText(hDC, m_pManager, rcText, m_sText, clrText, UICOLOR__INVALID, NULL, nLinks, 0); } // Paint dropdown edit box ::InflateRect(&rcText, -1, -1); if( m_iCurSel >= 0 ) { CUIControl* pControl = static_cast<CUIControl*>(m_items[m_iCurSel]); IListItemUI* pElement = static_cast<IListItemUI*>(pControl->GetInterface(_T("ListItem"))); if( pElement != NULL ) { // Render item with specific draw-style int nLinks = 0; CUIBlueRenderEngine::DoPaintPrettyText(hDC, m_pManager, rcText, pControl->GetText(), UICOLOR_CONTROL_TEXT_NORMAL, UICOLOR__INVALID, NULL, nLinks, DT_SINGLELINE | DT_VCENTER); } else { //// Allow non-listitems to render as well. RECT rcOldPos = pControl->GetPos(); pControl->SetPos(rcText); pControl->DoPaint(hDC, rcText); pControl->SetPos(rcOldPos); } } }
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); }