void CDrawButton::Draw (CDC* pDC, DWORD wStyle) const { if ( wStyle == DB_DEFAULT ) { wStyle = m_wStyle; } ASSERT (pDC != NULL); CRect rc (m_Rect); CPenDC pen (pDC->m_hDC, ::GetSysColor (COLOR_3DFACE)); CBrushDC brush (pDC->m_hDC, ::GetSysColor (COLOR_3DFACE)); if ( DB_ISBORDER(m_wStyle) && !DB_ISFLAT(wStyle) ) { pDC->MoveTo (rc.right-1, rc.top); pDC->LineTo (rc.left, rc.top); pDC->LineTo (rc.left, rc.bottom); pDC->SetPixel (rc.right-1, rc.top, ::GetSysColor (COLOR_3DDKSHADOW)); rc.left++; rc.top++; } COLORREF crBorder = 0, crPressed = 0, crOver = 0, crText = 0; if ( DB_ISFLAT(wStyle) ) { crBorder = ::GetSysColor (COLOR_HIGHLIGHT); crPressed = HLS_TRANSFORM (crBorder, +50, -50); crOver = HLS_TRANSFORM (crBorder, +70, -57); } if ( DB_GETTYPE(wStyle) == DB_UPDOWN ) { if ( !DB_ISPRESSED2(wStyle) ) { if ( DB_ISFLAT(wStyle) ) { CRect rcBtn (rc.left, rc.top, rc.right, (rc.top+rc.bottom)/2+1); if ( DB_ISENABLED(wStyle) && DB_ISOVER(wStyle) ) { pen.Color (crBorder); brush.Color (DB_ISPRESSED(wStyle) ? crPressed : crOver); pDC->Rectangle (rcBtn); } else if ( !DB_ISTRANSPARENT(wStyle) ) { pen.Color (::GetSysColor (DB_ISBORDER(m_wStyle) ? COLOR_3DSHADOW : COLOR_WINDOW)); pDC->Rectangle (rcBtn); } } else { CRect rcBtn (rc.left, rc.top, rc.right, (rc.top+rc.bottom)/2); pDC->DrawFrameControl (rcBtn, DFC_BUTTON, DFCS_BUTTONPUSH|(DB_ISPRESSED1(wStyle) ? DFCS_PUSHED : 0)); } } if ( !DB_ISPRESSED(wStyle) && !DB_ISFLAT(wStyle) ) { pDC->MoveTo (rc.left, (rc.top+rc.bottom)/2); pDC->LineTo (rc.right, (rc.top+rc.bottom)/2); } if ( !DB_ISPRESSED1(wStyle) ) { if ( DB_ISFLAT(wStyle) ) { CRect rcBtn (rc.left, (rc.top+rc.bottom)/2/*+rc.Height()%2*/, rc.right, rc.bottom); if ( DB_ISENABLED(wStyle) && DB_ISOVER(wStyle) ) { pen.Color (crBorder); brush.Color (DB_ISPRESSED(wStyle) ? crPressed : crOver); pDC->Rectangle (rcBtn); } else if ( !DB_ISTRANSPARENT(wStyle) ) { pen.Color (::GetSysColor (DB_ISBORDER(m_wStyle) ? COLOR_3DSHADOW : COLOR_WINDOW)); pDC->Rectangle (rcBtn); } } else { CRect rcBtn (rc.left, (rc.top+rc.bottom)/2+rc.Height()%2, rc.right, rc.bottom); pDC->DrawFrameControl (rcBtn, DFC_BUTTON, DFCS_BUTTONPUSH|(DB_ISPRESSED2(wStyle) ? DFCS_PUSHED : 0)); } } if ( DB_ISFLAT(wStyle) ) { crText = DB_ISENABLED(wStyle) && pDC->GetPixel (rc.left+1, rc.top+1) == crOver ? RGB(0,0,0) : ::GetSysColor (COLOR_BTNTEXT); pen.Color (DB_ISPRESSED(wStyle) ? RGB(240,240,240) : DB_ISENABLED(wStyle) ? crText : ::GetSysColor (COLOR_GRAYTEXT)); } else { pen.Color (::GetSysColor (DB_ISENABLED(wStyle) ? COLOR_BTNTEXT : COLOR_GRAYTEXT)); } if ( !DB_ISPRESSED2(wStyle) ) { _DrawTriangle (pDC, (rc.left+rc.right)/2 + ((DB_ISPRESSED1(wStyle)&&!DB_ISFLAT(wStyle)) ? 1 : 0), (rc.top*3+rc.bottom)/4 + ((DB_ISPRESSED1(wStyle)||DB_ISFLAT(wStyle)) ? 1 : 0) - 2, 3, false); } if ( !DB_ISPRESSED1(wStyle) ) { _DrawTriangle (pDC, (rc.left+rc.right)/2 + ((DB_ISPRESSED2(wStyle)&&!DB_ISFLAT(wStyle)) ? 1 : 0), (rc.top+rc.bottom*3)/4 + ((DB_ISPRESSED2(wStyle)&&!DB_ISFLAT(wStyle)) ? 1 : 0) + 1, 3, true); } } else { if ( DB_ISFLAT(wStyle) ) { if ( DB_ISENABLED(wStyle) && DB_ISOVER(wStyle) ) { pen.Color (crBorder); brush.Color (DB_ISPRESSED(wStyle) ? crPressed : crOver); pDC->Rectangle (rc); } else if ( !DB_ISTRANSPARENT(wStyle) ) { pen.Color (::GetSysColor (DB_ISBORDER(m_wStyle) ? COLOR_3DSHADOW : COLOR_WINDOW)); pDC->Rectangle (rc); } } else { pDC->DrawFrameControl (rc, DFC_BUTTON, DFCS_BUTTONPUSH|(DB_ISPRESSED(wStyle) ? DFCS_PUSHED : 0)); } switch ( DB_GETTYPE(wStyle) ) { case DB_3POINTS: if ( DB_ISFLAT(wStyle) ) { crText = DB_ISENABLED(wStyle) && pDC->GetPixel (rc.left+1, rc.top+1) == crOver ? RGB(0,0,0) : ::GetSysColor (COLOR_BTNTEXT); crText = DB_ISPRESSED(wStyle) ? RGB(240,240,240) : DB_ISENABLED(wStyle) ? crText : ::GetSysColor (COLOR_GRAYTEXT); } else { crText = ::GetSysColor (DB_ISENABLED(wStyle) ? COLOR_BTNTEXT : COLOR_GRAYTEXT); } crText = pDC->SetTextColor (crText); pDC->SetBkMode (TRANSPARENT); pDC->DrawText (_T("..."), 3, CRect(rc.left + ((DB_ISPRESSED(wStyle)||DB_ISFLAT(wStyle)) ? 2 : 1), rc.top, rc.right, rc.bottom + ((DB_ISPRESSED(wStyle)&&!DB_ISFLAT(wStyle)) ? 1 : 0)), DT_LEFT|DT_BOTTOM|DT_SINGLELINE); pDC->SetTextColor (crText); break; case DB_UP: case DB_DOWN: if ( DB_ISFLAT(wStyle) ) { crText = DB_ISENABLED(wStyle) && pDC->GetPixel (rc.left+1, rc.top+1) == crOver ? RGB(0,0,0) : ::GetSysColor (COLOR_BTNTEXT); pen.Color (DB_ISPRESSED(wStyle) ? RGB(240,240,240) : DB_ISENABLED(wStyle) ? crText : ::GetSysColor (COLOR_GRAYTEXT)); } else { pen.Color (::GetSysColor (DB_ISENABLED(wStyle) ? COLOR_BTNTEXT : COLOR_GRAYTEXT)); } _DrawTriangle (pDC, (rc.left+rc.right)/2 + ((DB_ISPRESSED(wStyle)&&!DB_ISFLAT(wStyle)) ? 1 : 0), (rc.top+rc.bottom)/2 + ((DB_ISPRESSED(wStyle)||DB_ISFLAT(wStyle)) ? 2 : 1) - ((DB_GETTYPE(wStyle) == DB_UP) ? 3 : 0), 4, DB_GETTYPE(wStyle) == DB_DOWN); break; case DB_CROSS: { int x1 = (rc.left*2+rc.right)/3-1; int x2 = (rc.left+rc.right*2)/3; int y1 = (rc.top*2+rc.bottom)/3-1; int y2 = (rc.top+rc.bottom*2)/3-1; if ( DB_ISFLAT(wStyle) ) { x2++; y2++; } else if ( DB_ISPRESSED(wStyle) ) { x1++; y1++; x2++; y2++; } if ( DB_ISFLAT(wStyle) ) { crText = DB_ISENABLED(wStyle) && pDC->GetPixel (x1, y1+1) == crOver ? RGB(0,0,0) : ::GetSysColor (COLOR_BTNTEXT); pen.Color (DB_ISPRESSED(wStyle) ? RGB(240,240,240) : DB_ISENABLED(wStyle) ? crText : ::GetSysColor (COLOR_GRAYTEXT)); } else { pen.Color (::GetSysColor (DB_ISENABLED(wStyle) ? COLOR_BTNTEXT : COLOR_GRAYTEXT)); } pDC->MoveTo (x1, y1); pDC->LineTo (x2, y2+1); pDC->MoveTo (x1+1, y1); pDC->LineTo (x2+1, y2+1); pDC->MoveTo (x2-1, y1); pDC->LineTo (x1-1, y2+1); pDC->MoveTo (x2, y1); pDC->LineTo (x1, y2+1); } break; } } }
/////////////////////////////////////////////////////////////////////////////// // Paint the toolbar void CToolBarXP::OnPaint () { if ( m_bDelayedButtonLayout ) { Layout(); } CPaintDC cpDC (this); CBufferDC cDC (cpDC); CRect rcClip; cDC.GetClipBox (rcClip); cDC.SetBkMode (TRANSPARENT); cDC.SelectObject (CFont::FromHandle ((HFONT)GetStockObject (DEFAULT_GUI_FONT))); cDC.FillSolidRect (rcClip, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), 20, 0)); CPoint ptCursor; ::GetCursorPos (&ptCursor); ScreenToClient (&ptCursor); CClientRect rcClient (this); HIMAGELIST m_hImageList = (HIMAGELIST)DefWindowProc (TB_GETIMAGELIST, 0, 0); TBBUTTON tbbutton; int nCount = DefWindowProc (TB_BUTTONCOUNT, 0, 0); int nHotItem = GetToolBarCtrl().GetHotItem(); for ( int i = 0; i < nCount; i++ ) { VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton)); if ( !IS_VISIBLE(tbbutton) ) { continue; } CRect rcButton; VERIFY(DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcButton)); if ( !CRect().IntersectRect (rcClip, rcButton) ) { continue; } bool bOver = nHotItem == i && IS_ENABLED(tbbutton); bool bPressed = false; if ( IS_INDETERMINATE(tbbutton) ) { CPenDC pen (cDC, ::GetSysColor (COLOR_3DSHADOW)); cDC.MoveTo (rcButton.left, rcButton.bottom); cDC.LineTo (rcButton.left, rcButton.top); cDC.LineTo (rcButton.right-1, rcButton.top); cDC.LineTo (rcButton.right-1, rcButton.bottom-1); cDC.LineTo (rcButton.left, rcButton.bottom-1); bOver = true; } else if ( bOver || IS_CHECKED(tbbutton) ) { bPressed = KEYDOWN(VK_LBUTTON) && rcButton.PtInRect (ptCursor); if ( IS_DROPDOWN(tbbutton) && bPressed ) { bPressed = ptCursor.x < rcButton.right-13; if ( bPressed ) { rcButton.right -= 13; } } COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT); CPenDC pen (cDC, crHighLight); CBrushDC brush (cDC, bPressed||(bOver&&IS_CHECKED(tbbutton)) ? HLS_TRANSFORM (crHighLight, +50, -50) : (bOver ? HLS_TRANSFORM (crHighLight, +70, -57) : HLS_TRANSFORM (crHighLight, +80, -66))); cDC.Rectangle (&rcButton); if ( IS_DROPDOWN(tbbutton) ) { if ( bPressed ) { int nLeft = rcButton.left; rcButton.left = rcButton.right-1; rcButton.right += 13; brush.Color (HLS_TRANSFORM (crHighLight, +70, -66)); cDC.Rectangle (&rcButton); rcButton.left = nLeft; } else { cDC.MoveTo (rcButton.right-14, rcButton.top); cDC.LineTo (rcButton.right-14, rcButton.bottom); } } } if ( IS_SEPARATOR(tbbutton) ) { CPenDC pen (cDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -15, 0)); if ( IS_WRAP(tbbutton) ) { cDC.MoveTo (rcClient.left+2, rcButton.bottom-4); cDC.LineTo (rcClient.right-2, rcButton.bottom-4); } else { cDC.MoveTo ((rcButton.right+rcButton.left)/2-1, rcButton.top+2); cDC.LineTo ((rcButton.right+rcButton.left)/2-1, rcButton.bottom-2); } } else if ( !IS_CONTROL(tbbutton) ) { if ( IS_DROPDOWN(tbbutton) ) { CPenDC pen (cDC, ( bOver && !IS_INDETERMINATE(tbbutton) ) ? RGB(0,0,0) : ::GetSysColor (IS_ENABLED(tbbutton) ? COLOR_BTNTEXT : COLOR_GRAYTEXT)); cDC.MoveTo (rcButton.right-9, (rcButton.top+rcButton.bottom)/2-1); cDC.LineTo (rcButton.right-4, (rcButton.top+rcButton.bottom)/2-1); cDC.MoveTo (rcButton.right-8, (rcButton.top+rcButton.bottom)/2); cDC.LineTo (rcButton.right-5, (rcButton.top+rcButton.bottom)/2); cDC.SetPixel (rcButton.right-7, (rcButton.top+rcButton.bottom)/2+1, pen.Color()); rcButton.right -= 14; } if ( tbbutton.iBitmap >= 0 ) { if ( !IS_ENABLED(tbbutton) || (bOver && !bPressed) ) { HICON hIcon = ImageList_ExtractIcon (NULL, m_hImageList, tbbutton.iBitmap); cDC.DrawState (CPoint (rcButton.left + ( bOver ? 4 : 3 ), rcButton.top + ( bOver ? 4 : 3 )), m_sizeImage, hIcon, DSS_MONO, CBrush (bOver ? (IS_INDETERMINATE(tbbutton) ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -20, 0) : HLS_TRANSFORM (::GetSysColor (COLOR_HIGHLIGHT), +50, -66)) : HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -27, 0))); DestroyIcon (hIcon); } if ( IS_ENABLED(tbbutton) ) { ::ImageList_Draw (m_hImageList, tbbutton.iBitmap, cDC.m_hDC, rcButton.left + ( (bOver && !bPressed) ? 2 : 3 ), rcButton.top + ( (bOver && !bPressed) ? 2 : 3 ), ILD_TRANSPARENT); } } } } }
void CButtonXP::DrawItem (LPDRAWITEMSTRUCT pDis) { CBufferDC cDC (pDis->hDC); CRect rcItem (pDis->rcItem); HFONT hOldFont = (HFONT)cDC.SelectObject ((HFONT)::GetStockObject (DEFAULT_GUI_FONT)); CPenDC pen (cDC); CBrushDC brush (cDC); if ( (pDis->itemState & ODS_FOCUS) || LOWORD(::SendMessage (::GetParent (m_hWnd), DM_GETDEFID, 0, 0)) == GetDlgCtrlID() ) { rcItem.DeflateRect (1, 1); } if ( (pDis->itemState & ODS_DISABLED) || (!m_MouseMgr.MouseOver() && !(pDis->itemState & ODS_SELECTED)) ) { pen.Color (::GetSysColor (COLOR_3DSHADOW)); brush.Color (HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -10, 0)); } else { COLORREF crBorder = ::GetSysColor (COLOR_HIGHLIGHT); pen.Color (crBorder); if ( (pDis->itemState & ODS_SELECTED) ) { brush.Color (HLS_TRANSFORM (crBorder, +50, -50)); cDC.SetTextColor (RGB(240,240,240)); } else { brush.Color (HLS_TRANSFORM (crBorder, +80, -66)); cDC.SetTextColor (::GetSysColor (COLOR_BTNTEXT)); } } if ( (pDis->itemState & ODS_DISABLED) ) { cDC.SetTextColor (::GetSysColor (COLOR_GRAYTEXT)); } else if ( (pDis->itemState & ODS_SELECTED) ) { cDC.SetTextColor (RGB(240,240,240)); } else if ( m_MouseMgr.MouseOver() ) { cDC.SetTextColor (0); } else { cDC.SetTextColor (::GetSysColor (COLOR_BTNTEXT)); } cDC.Rectangle (rcItem); cDC.SetBkMode (TRANSPARENT); cDC.DrawText (CWindowText (this), rcItem, DT_SINGLELINE|DT_CENTER|DT_VCENTER); if ( (pDis->itemState & ODS_FOCUS) ) { rcItem.DeflateRect (3, 3); cDC.DrawFocusRect (rcItem); } cDC.SelectObject (hOldFont); }