void COXCoolComboBox::OnChangeHotState(BOOL bInHotState) { if(!bInHotState && ::GetFocus()==m_edit.GetSafeHwnd()) return; COXCoolCtrl<CComboBox>::OnChangeHotState(bInHotState); if(!IsDroppedDown()) { RedrawWindow(); } }
//************************************************************************** void CBCGPRibbonComboBox::OnLButtonDown (CPoint point) { ASSERT_VALID (this); CBCGPBaseRibbonElement::OnLButtonDown (point); if ((m_rectMenu.PtInRect (point) || !m_bHasEditBox) && !IsDroppedDown ()) { DropDownList (); } }
//************************************************************************** void CBCGPRibbonComboBox::OnDraw (CDC* pDC) { ASSERT_VALID (this); ASSERT_VALID (pDC); OnDrawLabelAndImage (pDC); BOOL bIsHighlighted = m_bIsHighlighted; if (m_bIsFocused) { m_bIsHighlighted = TRUE; } if (IsDisabled ()) { m_bIsHighlighted = FALSE; } CRect rectSaved = m_rect; m_rect.left = m_rectCommand.left; CBCGPVisualManager::GetInstance ()->OnFillRibbonButton (pDC, this); if (m_pWndEdit->GetSafeHwnd () == NULL) { CRect rectText = m_rectCommand; rectText.DeflateRect (m_szMargin); UINT uiDTFlags = DT_SINGLELINE | DT_VCENTER; if (!m_bSearchResultMode) { if (m_nAlign == ES_CENTER) { uiDTFlags |= DT_CENTER; } else if (m_nAlign == ES_RIGHT) { uiDTFlags |= DT_RIGHT; } } BOOL bDrawPrompt = m_strEdit.IsEmpty() && !m_strSearchPrompt.IsEmpty() && !IsDroppedDown(); const CString& str = bDrawPrompt ? m_strSearchPrompt : m_strEdit; COLORREF clrText = bDrawPrompt ? CBCGPVisualManager::GetInstance()->GetToolbarEditPromptColor() : (COLORREF)-1; if (IsDisabled()) { clrText = globalData.clrGrayedText; } DoDrawText (pDC, str, rectText, uiDTFlags, clrText); } if (m_bSearchMode && m_strEdit.IsEmpty() && m_ImageSearch.IsValid()) { CRect rectIcon = m_rectMenu; rectIcon.right = rectIcon.left - 1; rectIcon.left = rectIcon.right - rectIcon.Height(); m_ImageSearch.DrawEx(pDC, rectIcon, 0, CBCGPToolBarImages::ImageAlignHorzCenter, CBCGPToolBarImages::ImageAlignVertCenter, CRect(0, 0, 0, 0), IsDisabled() ? (BYTE)127 : (BYTE)255); } CBCGPVisualManager::GetInstance ()->OnDrawRibbonButtonBorder (pDC, this); CBCGPToolbarComboBoxButton buttonDummy; buttonDummy.m_bIsRibbon = TRUE; buttonDummy.m_bIsRibbonFloaty = IsFloatyMode (); BOOL bIsDropDownHighlighted = IsMenuAreaHighlighted () || m_bIsFocused || m_bIsEditFocused || (bIsHighlighted && !m_bHasEditBox); CBCGPVisualManager::GetInstance ()->OnDrawComboDropButton ( pDC, m_rectMenu, IsDisabled (), IsDroppedDown (), bIsDropDownHighlighted, &buttonDummy); if (m_bIsCalculator) { m_ButtonImages.DrawEx(pDC, m_rectMenu, 2, CBCGPToolBarImages::ImageAlignHorzCenter, CBCGPToolBarImages::ImageAlignVertCenter); } m_bIsHighlighted = bIsHighlighted; m_rect = rectSaved; }
void COXCoolComboBox::OnPaint() { if(!IsInCoolState()) { Default(); return; } // set up all the pens we are likely to need HPEN penDefault=(HPEN)GetStockObject(BLACK_PEN); static CPen penHilite(PS_SOLID,1,GetSysColor(COLOR_3DHIGHLIGHT)); static CPen penShadow(PS_SOLID,1,GetSysColor(COLOR_3DSHADOW)); static CPen penFace3D(PS_SOLID,1,GetSysColor(COLOR_3DFACE)); static CPen penDkShad3D(PS_SOLID,1,GetSysColor(COLOR_3DDKSHADOW)); // store margins for future use int nLeftMargin=GetLeftMargin(); int nRightMargin=GetRightMargin(); int nTopMargin=GetTopMargin(); int nBottomMargin=GetBtmMargin(); CRect button_rect=GetButtonRect(); const BOOL bSimpleCombo=((GetStyle()&0x000f)==CBS_SIMPLE); const BOOL bIsEnabled=IsWindowEnabled(); const BOOL bIsHot=IsInHotState() & bIsEnabled; // paint background CPaintDC paintdc(this); CDC* dc=&paintdc; CRect rect, rectClient, rectInternal; // temp rect, client rect, internal rect respectively GetClientRect(rectClient); rectClient.right-=::GetSystemMetrics(SM_CXVSCROLL)-GetButtonWidth(); if(bSimpleCombo) { ASSERT(::IsWindow(m_edit.GetSafeHwnd())); CRect rectEdit; m_edit.GetWindowRect(rectEdit); rectClient.bottom=rectClient.top+rectEdit.Height()+5; } // set up internal rectangle rectInternal=rectClient; rectInternal.left+=nLeftMargin; rectInternal.top+=nTopMargin; rectInternal.right-=nRightMargin; rectInternal.bottom-=nBottomMargin; rect=rectInternal; if(!button_rect.IsRectEmpty()) rect.right=button_rect.left; if(!bIsEnabled) ::FillRect(dc->m_hDC,&rect,GetSysColorBrush(COLOR_3DFACE)); else ::FillRect(dc->m_hDC,&rect,GetSysColorBrush(COLOR_WINDOW)); // do default painting if(!::IsWindow(m_edit.GetSafeHwnd())) { DRAWITEMSTRUCT dis={ sizeof(&dis) }; dis.CtlType=ODT_COMBOBOX; dis.CtlID=GetWindowLongPtr(m_hWnd, GWL_ID); dis.itemID=GetCurSel(); dis.itemAction=ODA_DRAWENTIRE; dis.hwndItem=m_hWnd; dis.hDC=dc->m_hDC; dis.rcItem=CRect(nLeftMargin+1,nTopMargin+1, button_rect.left-1,rectClient.bottom-nBottomMargin-1); dis.itemData=GetItemData(GetCurSel()); dis.itemState=((::GetFocus()==GetSafeHwnd() && !IsDroppedDown()) ? ODS_FOCUS : 0); DrawItem(&dis); } // now do our painting - first borderect... // but first exclude the 'real' client area from the DC dc->SelectClipRgn(NULL); // from drawing background dc->ExcludeClipRect(&rectInternal); // draw border if(!bIsHot) { // now paint background if(bSimpleCombo) FillRect(dc->m_hDC, &rectClient, ::GetSysColorBrush(COLOR_WINDOW)); else FillRect(dc->m_hDC, &rectClient, ::GetSysColorBrush(COLOR_3DFACE)); // fill in small area to the left of edit window in appropriate colour, // to make window look bigger rect=rectClient; rect.top+=nTopMargin; rect.left+=nLeftMargin-1; rect.right=rect.left+1; rect.bottom-=nBottomMargin; if(bIsEnabled) FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_WINDOW)); else FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } else { // HOT case - difficult to describe, but reasonably obvious rect=rectClient; rect.left++; rect.right--; rect.top++; rect.bottom-=1+EXTRA_BOTTOM_MARGIN; // paint background FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); // and border rect=rectClient; SelectObject(dc->m_hDC,penShadow); dc->MoveTo(0,0); dc->LineTo(rect.right,0); dc->MoveTo(0,0); dc->LineTo(0,rect.bottom-1-EXTRA_BOTTOM_MARGIN); SelectObject(dc->m_hDC,penHilite); dc->LineTo(rect.right-1,rect.bottom-1-EXTRA_BOTTOM_MARGIN); dc->LineTo(rect.right-1,rect.top); // and paint extra margin if(EXTRA_BOTTOM_MARGIN) { rect=rectClient; rect.top=rect.bottom-EXTRA_BOTTOM_MARGIN; FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } } // unselect the clip region SelectClipRgn(dc->m_hDC, NULL); // now draw highlight border, if disabled if(!bIsEnabled) { SelectObject(dc->m_hDC, GetStockObject(NULL_BRUSH)); SelectObject(dc->m_hDC, penHilite); dc->Rectangle(rectInternal.left-1, rectInternal.top-1, rectInternal.right+1, rectInternal.bottom+1); } // and now for the button BOOL pressed=IsDroppedDown(); rect=button_rect; // do the background if(bIsHot) { rect.bottom--; rect.right++; } if(bIsHot || pressed || !bIsEnabled) { ::FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } else { if(bIsEnabled) { // cold and unpressed SelectObject(dc->m_hDC, penHilite); SelectObject(dc->m_hDC, GetSysColorBrush(COLOR_3DFACE)); ::Rectangle(dc->m_hDC, rect.left, rect.top, rect.right, rect.bottom); } } rect=button_rect; // set again if(bIsHot || pressed) { if(pressed) { SelectObject(dc->m_hDC, penShadow); dc->MoveTo(rect.left , rect.top); dc->LineTo(rect.right, rect.top); dc->MoveTo(rect.left , rect.top); dc->LineTo(rect.left , rect.bottom); } else { SelectObject(dc->m_hDC, penHilite); dc->MoveTo(rect.right, rect.top); dc->LineTo(rect.left+1, rect.top); dc->LineTo(rect.left+1, rect.bottom); SelectObject(dc->m_hDC, penFace3D); dc->MoveTo(rect.left, rect.top); dc->LineTo(rect.left, rect.bottom); SelectObject(dc->m_hDC, penShadow); dc->MoveTo(rect.left , rect.bottom - 1); dc->LineTo(rect.right-1, rect.bottom - 1); dc->LineTo(rect.right-1, rect.top); } SelectObject(dc->m_hDC, penDefault); } // now draw shadowy arrow SelectObject(dc->m_hDC, penDkShad3D); SelectObject(dc->m_hDC, ::GetSysColorBrush(COLOR_3DDKSHADOW)); POINT p[3]; p[0].x=rect.left +((rect.right - rect.left) / 3); p[1].x=rect.left +(2 *(rect.right - rect.left) / 3) + 1; p[2].x=(p[0].x + p[1].x) / 2; if(((p[1].x - p[0].x) % 2)) p[1].x--; p[0].y=(rect.top + rect.bottom / 2) -(p[1].x - p[0].x) / 4 - 1; p[1].y=p[0].y; p[2].y=p[0].y +(p[1].x - p[0].x) / 2; if(pressed) // offset by a pixel { p[0].x++; p[0].y++; p[1].x++; p[1].y++; p[2].x++; p[2].y++; } Polygon(dc->m_hDC, p, 3); }
//***************************************************************************************** void CBCGPCalendarMenuButton::OnDraw (CDC* pDC, const CRect& rect, CBCGPToolBarImages* pImages, BOOL bHorz, BOOL bCustomizeMode, BOOL bHighlight, BOOL bDrawBorder, BOOL bGrayDisabledButtons) { ASSERT_VALID (this); ASSERT_VALID (pDC); if (m_bMenuMode) { DrawMenuItem (pDC, rect, pImages, bCustomizeMode, bHighlight, bGrayDisabledButtons); return; } //---------------------- // Fill button interior: //---------------------- FillInterior (pDC, rect, bHighlight || IsDroppedDown ()); CSize sizeImage = CBCGPMenuImages::Size (); if (CBCGPToolBar::IsLargeIcons ()) { sizeImage.cx *= 2; sizeImage.cy *= 2; } CRect rectInternal = rect; CSize sizeExtra = m_bExtraSize ? visualManagerInstance->GetButtonExtraBorder () : CSize (0, 0); if (sizeExtra != CSize (0, 0)) { rectInternal.DeflateRect (sizeExtra.cx / 2 + 1, sizeExtra.cy / 2 + 1); } CRect rectParent = rect; CRect rectArrow = rectInternal; const int nMargin = visualManagerInstance->GetMenuImageMargin (); const int xMargin = bHorz ? nMargin : 0; const int yMargin = bHorz ? 0 : nMargin; rectInternal.DeflateRect (xMargin, yMargin); rectParent.DeflateRect (xMargin, yMargin); if (m_bDrawDownArrow) { if (bHorz) { rectParent.right -= sizeImage.cx + SEPARATOR_SIZE; rectArrow.left = rectParent.right - 1; rectArrow.OffsetRect (-sizeExtra.cx / 2, -sizeExtra.cy / 2); } else { rectParent.bottom -= sizeImage.cy + SEPARATOR_SIZE; rectArrow.top = rectParent.bottom - 1; } } UINT uiStyle = m_nStyle; if (visualManagerInstance->IsMenuFlatLook ()) { m_nStyle &= ~(TBBS_PRESSED | TBBS_CHECKED); } else { if (m_bClickedOnMenu && m_nID != 0 && m_nID != (UINT) -1 && !m_bMenuOnly) { m_nStyle &= ~TBBS_PRESSED; } else if (m_pPopupMenu != NULL) { m_nStyle |= TBBS_PRESSED; } } BOOL bDisableFill = m_bDisableFill; m_bDisableFill = TRUE; CBCGPToolbarButton::OnDraw (pDC, rectParent, pImages, bHorz, bCustomizeMode, bHighlight, bDrawBorder, bGrayDisabledButtons); m_bDisableFill = bDisableFill; if (m_bDrawDownArrow) { if ((m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) && !visualManagerInstance->IsMenuFlatLook ()) { rectArrow.OffsetRect (1, 1); } BOOL bDisabled = (bCustomizeMode && !IsEditable ()) || (!bCustomizeMode && (m_nStyle & TBBS_DISABLED)); int iImage; if (bHorz && !m_bMenuOnly) { iImage = CBCGPMenuImages::IdArowDown; } else { iImage = CBCGPMenuImages::IdArowRight; } if (m_pPopupMenu != NULL && (m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) == 0 && !visualManagerInstance->IsMenuFlatLook ()) { rectArrow.OffsetRect (1, 1); } CBCGPMenuImages::Draw (pDC, (CBCGPMenuImages::IMAGES_IDS) iImage, rectArrow, bDisabled ? CBCGPMenuImages::ImageGray : CBCGPMenuImages::ImageBlack, sizeImage); } m_nStyle = uiStyle; if (!bCustomizeMode) { if ((m_nStyle & (TBBS_PRESSED | TBBS_CHECKED)) || m_pPopupMenu != NULL) { //----------------------- // Pressed in or checked: //----------------------- if (!visualManagerInstance->IsMenuFlatLook () && m_bClickedOnMenu && m_nID != 0 && m_nID != (UINT) -1 && !m_bMenuOnly) { visualManagerInstance->OnDrawButtonBorder (pDC, this, rectParent, visualManager::ButtonsIsHighlighted); rectArrow.right --; rectArrow.bottom --; visualManagerInstance->OnDrawButtonBorder (pDC, this, rectArrow, visualManager::ButtonsIsPressed); } else { visualManagerInstance->OnDrawButtonBorder (pDC, this, rect, visualManager::ButtonsIsPressed); } } else if (bHighlight && !(m_nStyle & TBBS_DISABLED) && !(m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE))) { visualManagerInstance->OnDrawButtonBorder (pDC, this, rect, visualManager::ButtonsIsHighlighted); } } }