void CDrawButton::CheckForMouseOver (CWnd* pWnd, CPoint pt) { if ( DB_ISFLAT(m_wStyle) ) { if ( !DB_ISOVER(m_wStyle) && PtInRect (pt) ) { if ( pWnd->SetTimer (54321, 300, &CDrawButton_TimerProcMouseOver) ) { m_wStyle |= DB_OVER; CClientDC cDC (pWnd); Draw (&cDC); } } else if ( DB_ISOVER(m_wStyle) && !PtInRect (pt) ) { pWnd->KillTimer (54321); m_wStyle &= ~DB_OVER; pWnd->InvalidateRect (m_Rect); } } }
void CXTPTabCtrlButton::CheckForMouseOver (CWnd* pWnd, CPoint pt) { if (!PtInRect (pt) && DB_ISOVER(m_wStyle)) { m_wStyle &= ~DB_OVER; pWnd->InvalidateRect (m_Rect, FALSE); } if (!DB_ISOVER(m_wStyle) && PtInRect (pt) && DB_ISENABLED(m_wStyle)) { TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT), TME_LEAVE, *pWnd, 0 }; _TrackMouseEvent(&tme); m_wStyle |= DB_OVER; pWnd->InvalidateRect (m_Rect, FALSE); } }
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; } } }