// MyCell - version 1.1
// Written by Yanxueming <yanxm2003@hotmail.com>
// Copyright (C) 2006-2007
// All rights reserved.
//
// The code and information is provided "as-is" without
// warranty of any kind, either expressed or implied.
#include "stdafx.h"
#include "../include/ColorButton.h"
namespace mycell{
namespace ui{
CColorButtonBase::CColorButtonBase()
{
m_color=CLR_DEFAULT;
m_clrDefault=RGB(0,0,0);//::GetSysColor(COLOR_APPWORKSPACE);
m_bPopupActive=FALSE;
m_bTrackSelection=FALSE;
//m_mixColorPopup.CoCreateInstance(__uuidof(MixColorPopup));
m_lpstrToolTipText=NULL;
m_fHover=FALSE;
m_fMouseOver=0;
}
void CColorButtonBase::AfterSubclassWindow()
{
ModifyStyle(0, BS_OWNERDRAW);
//m_mixColorPopup->Initialize((OLE_HANDLE)m_hWnd,m_strDefaultText,m_strCustomText);//_T("Automatic"),_T("More Colors..."));
// create a tool tip
m_tip.Create(m_hWnd);
ATLASSERT(m_tip.IsWindow());
if(m_tip.IsWindow() && m_lpstrToolTipText != NULL)
{
m_tip.Activate(TRUE);
m_tip.AddTool(m_hWnd, m_lpstrToolTipText);
}
theme_.OpenThemeData (m_hWnd,L"Button");
}
HRESULT CColorButtonBase::GetToolTipText(BSTR *pVal)
{
ATLASSERT(pVal != NULL);
if(m_lpstrToolTipText == NULL)
return Error("not tooltiptext has setted.");
USES_CONVERSION;
*pVal=::SysAllocString(T2OLE(m_lpstrToolTipText));
return S_OK;
}
HRESULT CColorButtonBase::SetToolTipText(BSTR lpstrText)
{
if(m_lpstrToolTipText != NULL)
{
delete [] m_lpstrToolTipText;
m_lpstrToolTipText = NULL;
}
if(lpstrText == NULL)
{
if(m_tip.IsWindow())
m_tip.Activate(FALSE);
return S_OK;
}
USES_CONVERSION;
ATLTRY(m_lpstrToolTipText = new TCHAR[::lstrlen(W2T(lpstrText)) + 1]);
if(m_lpstrToolTipText == NULL)
return S_FALSE;
bool bRet = (::lstrcpy(m_lpstrToolTipText, OLE2T(lpstrText)) != NULL);
if(bRet && m_tip.IsWindow())
{
m_tip.Activate(TRUE);
m_tip.AddTool(m_hWnd, m_lpstrToolTipText);
}
return bRet?S_OK:S_FALSE;
}
void CColorButtonBase::OnDrawItem(LPDRAWITEMSTRUCT lpItem)
{
CDCHandle dc (lpItem ->hDC);
UINT uState = lpItem ->itemState;
CRect rcDraw = lpItem ->rcItem;
m_bPopupActive = false;
//
// Draw the outer edge
//
if (theme_.m_hTheme != NULL){
UINT uFrameState = 0;
if ((uState & ODS_SELECTED) != 0 || m_bPopupActive)
uFrameState |= PBS_PRESSED;
if ((uState & ODS_DISABLED) != 0)
uFrameState |= PBS_DISABLED;
if ((uState & ODS_HOTLIGHT) != 0 || m_fMouseOver)
uFrameState |= PBS_HOT;
else if ((uState & ODS_DEFAULT) != 0)
uFrameState |= PBS_DEFAULTED;
theme_.DrawThemeBackground (dc, BP_PUSHBUTTON,
uFrameState, &rcDraw,&rcDraw);// NULL);
theme_.GetThemeBackgroundContentRect (dc, BP_PUSHBUTTON,
uFrameState, &rcDraw, &rcDraw);
}else{
UINT uFrameState = DFCS_BUTTONPUSH | DFCS_ADJUSTRECT;
if ((uState & ODS_SELECTED) != 0 || m_bPopupActive)
uFrameState |= DFCS_PUSHED;
if ((uState & ODS_DISABLED) != 0)
uFrameState |= DFCS_INACTIVE;
dc .DrawFrameControl (&rcDraw, DFC_BUTTON, uFrameState);
//
// Adjust the position if we are selected (gives a 3d look)
//
if ((uState & ODS_SELECTED) != 0 || m_bPopupActive)
;//rcDraw .OffsetRect (1, 1);
}
//
// Draw focus
//
if ((uState & ODS_FOCUS) != 0 || m_bPopupActive)
{
CRect rcFocus (rcDraw.left, rcDraw.top,
rcDraw.right - 1, rcDraw.bottom);
dc .DrawFocusRect(&rcFocus);
}
rcDraw .InflateRect (
- ::GetSystemMetrics(SM_CXEDGE),
- ::GetSystemMetrics(SM_CYEDGE));
//
// Draw the arrow
//
{
CRect rcArrow;
rcArrow .left = rcDraw. right - g_ciArrowSizeX - ::GetSystemMetrics (SM_CXEDGE) / 2+1;
rcArrow .top = (rcDraw.bottom + rcDraw.top)/2 - g_ciArrowSizeY / 2+1;
rcArrow .right = rcArrow.left + g_ciArrowSizeX-2;
rcArrow .bottom = (rcDraw .bottom + rcDraw .top) / 2 + g_ciArrowSizeY / 2-1;
DrawArrow (dc, rcArrow, 0,
(uState & ODS_DISABLED) ? ::GetSysColor (COLOR_GRAYTEXT) : RGB (0,0,0));
rcDraw.right = rcArrow.left - ::GetSystemMetrics (SM_CXEDGE) / 2;
}
//
// Draw separator
//
//dc .DrawEdge (&rcDraw, EDGE_ETCHED, BF_RIGHT);
//rcDraw.right -= (::GetSystemMetrics (SM_CXEDGE) * 2) + 1 ;
//
// Draw color
//
if ((uState & ODS_DISABLED) == 0)
{
//dc .SetBkColor ((m_clrCurrent == CLR_DEFAULT) ? m_clrDefault : m_clrCurrent);
//dc .ExtTextOut (0, 0, ETO_OPAQUE, &rcDraw, NULL, 0, NULL);
//dc .FrameRect (&rcDraw, (HBRUSH)::GetStockObject (BLACK_BRUSH));
dc.FillSolidRect(&rcDraw,(m_color == CLR_DEFAULT)? m_clrDefault: m_color);
::FrameRect(dc.m_hDC,&rcDraw,(HBRUSH)::GetStockObject(BLACK_BRUSH));
}
/*
CRect rDraw;
GetClientRect(&rDraw);
dc.FillSolidRect(&rDraw,::GetSysColor(COLOR_BTNFACE));
CRect rArrow;
UINT state=GetState();
if (m_bPopupActive)
state |= ODS_SELECTED|ODS_FOCUS;
//******************************************************
//** Draw Outer Edge
//******************************************************
UINT uFrameState = DFCS_BUTTONPUSH|DFCS_ADJUSTRECT;
if (state & ODS_SELECTED)
uFrameState |= DFCS_PUSHED;
if (state & ODS_DISABLED)
uFrameState |= DFCS_INACTIVE;
if (theme_.m_hTheme != NULL)
{
//
// Draw the outer edge
//
UINT uFrameState = 0;
if ((state & ODS_SELECTED) != 0 || m_bPopupActive)
uFrameState |= PBS_PRESSED;
if ((state & ODS_DISABLED) != 0)
uFrameState |= PBS_DISABLED;
if ((state & ODS_HOTLIGHT) != 0 || m_fMouseOver)
uFrameState |= PBS_HOT;
else if ((state & ODS_DEFAULT) != 0)
uFrameState |= PBS_DEFAULTED;
theme_.DrawThemeBackground (dc, BP_PUSHBUTTON,
uFrameState, &rDraw, NULL);
theme_.GetThemeBackgroundContentRect (dc, BP_PUSHBUTTON,
uFrameState, &rDraw, &rDraw);
}else{
if(!m_fHover||m_fMouseOver==1)
dc.DrawFrameControl(&rDraw,DFC_BUTTON,uFrameState);
else
::FrameRect(dc.m_hDC,&rDraw,(HBRUSH)::GetStockObject(BLACK_BRUSH));
}
//******************************************************
//** Draw Focus
//******************************************************
if (state & ODS_FOCUS)
{
RECT rFocus = {rDraw.left,
rDraw.top,
rDraw.right - 1,
rDraw.bottom};
dc.DrawFocusRect(&rFocus);
}
rDraw.DeflateRect(::GetSystemMetrics(SM_CXEDGE),
::GetSystemMetrics(SM_CYEDGE));
//******************************************************
//** Draw Arrow
//******************************************************
rArrow.left = rDraw.right - g_ciArrowSizeX - ::GetSystemMetrics(SM_CXEDGE) /2+1;
rArrow.right = rArrow.left + g_ciArrowSizeX-2;
rArrow.top = (rDraw.bottom + rDraw.top)/2 - g_ciArrowSizeY / 2+1;
rArrow.bottom = (rDraw.bottom + rDraw.top)/2 + g_ciArrowSizeY / 2-1;
DrawArrow(dc.m_hDC,rArrow,0,
(state & ODS_DISABLED)
? ::GetSysColor(COLOR_GRAYTEXT)
: RGB(0,0,0));
rDraw.right = rArrow.left - ::GetSystemMetrics(SM_CXEDGE)/2;
//******************************************************
//** Draw Separator
//******************************************************
//if(!m_fHover||m_fMouseOver==1)
dc.DrawEdge(&rDraw,EDGE_ETCHED,BF_RIGHT);
rDraw.right -= (::GetSystemMetrics(SM_CXEDGE) * 2) + 1 ;
//******************************************************
//** Draw Color
//******************************************************
if ((state & ODS_DISABLED) == 0)
{
dc.FillSolidRect(&rDraw,(m_color == CLR_DEFAULT)? m_clrDefault: m_color);
::FrameRect(dc.m_hDC,&rDraw,(HBRUSH)::GetStockObject(BLACK_BRUSH));
}
*/
}
void CColorButtonBase::DrawArrow(CDCHandle dc,const RECT& rect/*RECT* pRect*/,int iDirection,COLORREF clrArrow)
{
POINT ptsArrow[3];
switch (iDirection)
{
case 0 : // Down
{
ptsArrow [0] .x = rect .left;
ptsArrow [0] .y = rect .top;
ptsArrow [1] .x = rect .right;
ptsArrow [1] .y = rect .top;
ptsArrow [2] .x = (rect .left + rect .right) / 2;
ptsArrow [2] .y = rect .bottom;
break;
}
case 1 : // Up
{
ptsArrow [0] .x = rect .left;
ptsArrow [0] .y = rect .bottom;
ptsArrow [1] .x = rect .right;
ptsArrow [1] .y = rect .bottom;
ptsArrow [2] .x = (rect .left + rect .right) / 2;
ptsArrow [2] .y = rect .top;
break;
}
case 2 : // Left
{
ptsArrow [0] .x = rect .right;
ptsArrow [0] .y = rect .top;
ptsArrow [1] .x = rect .right;
ptsArrow [1] .y = rect .bottom;
ptsArrow [2] .x = rect .left;
ptsArrow [2] .y = (rect .top + rect .bottom) / 2;
break;
}
case 3 : // Right
{
ptsArrow [0] .x = rect .left;
ptsArrow [0] .y = rect .top;
ptsArrow [1] .x = rect .left;
ptsArrow [1] .y = rect .bottom;
ptsArrow [2] .x = rect .right;
ptsArrow [2] .y = (rect .top + rect .bottom) / 2;
break;
}
}
CBrush brArrow;
brArrow .CreateSolidBrush (clrArrow);
CPen penArrow;
penArrow .CreatePen (PS_SOLID, 0, clrArrow);
HBRUSH hbrOld = dc .SelectBrush (brArrow);
HPEN hpenOld = dc .SelectPen (penArrow);
dc .SetPolyFillMode (WINDING);
dc .Polygon (ptsArrow, 3);
dc .SelectBrush (hbrOld);
dc .SelectPen (hpenOld);
/*
POINT ptsArrow[3];
switch (iDirection)
{
case 0 : // Down
{
ptsArrow[0].x = pRect->left;
ptsArrow[0].y = pRect->top;
ptsArrow[1].x = pRect->right;
ptsArrow[1].y = pRect->top;
ptsArrow[2].x = (pRect->left + pRect->right)/2;
ptsArrow[2].y = pRect->bottom;
break;
}
case 1 : // Up
{
ptsArrow[0].x = pRect->left;
ptsArrow[0].y = pRect->bottom;
ptsArrow[1].x = pRect->right;
ptsArrow[1].y = pRect->bottom;
ptsArrow[2].x = (pRect->left + pRect->right)/2;
ptsArrow[2].y = pRect->top;
break;
}
case 2 : // Left
{
ptsArrow[0].x = pRect->right;
ptsArrow[0].y = pRect->top;
ptsArrow[1].x = pRect->right;
ptsArrow[1].y = pRect->bottom;
ptsArrow[2].x = pRect->left;
ptsArrow[2].y = (pRect->top + pRect->bottom)/2;
break;
}
case 3 : // Right
{
ptsArrow[0].x = pRect->left;
ptsArrow[0].y = pRect->top;
ptsArrow[1].x = pRect->left;
ptsArrow[1].y = pRect->bottom;
ptsArrow[2].x = pRect->right;
ptsArrow[2].y = (pRect->top + pRect->bottom)/2;
break;
}
}
//CBrush brsArrow(clrArrow);
HBRUSH brsArrow=::CreateSolidBrush(clrArrow);
//CPen penArrow(PS_SOLID, 1 , clrArrow);
HPEN hpenArrow=::CreatePen(PS_SOLID, 1 , clrArrow);
//CBrush* pOldBrush = pDC->SelectObject(&brsArrow);
HBRUSH hOldBrush=dc.SelectBrush(brsArrow);
//CPen* pOldPen = pDC->SelectObject(&penArrow);
HPEN hOldPen=dc.SelectPen(hpenArrow);
dc.SetPolyFillMode(WINDING);
dc.Polygon(ptsArrow, 3);
dc.SelectBrush(hOldBrush);
dc.SelectPen(hOldPen);
::DeleteObject(brsArrow);
::DeleteObject(hpenArrow);
*/
}
}//namespace ui
}//namespace mycell