You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
8.8 KiB
C++

// 3DBar.cpp: implementation of the C3DBar class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "3DBar.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
C3DBar::C3DBar()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
m_crChannel = RGB(255, 100, 0);
UpdateColours();
CreatePens();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
C3DBar::~C3DBar()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void C3DBar::UpdateColours()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
// Calculates the lighter and darker colors, as well as the shadow colors.
m_crColorLight = LightenColor(m_crChannel, 51);
m_crColorLighter = LightenColor(m_crColorLight, 51);
m_crColorLightest = LightenColor(m_crColorLighter, 51);
m_crColorDark = DarkenColor(m_crChannel, 51);
m_crColorDarker = DarkenColor(m_crColorDark, 51);
m_crDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
m_crLiteShadow = ::GetSysColor(COLOR_3DSHADOW);
// Get a color halfway between COLOR_3DDKSHADOW and COLOR_3DSHADOW
BYTE byRed3DDkShadow = GetRValue(m_crDkShadow);
BYTE byRed3DLiteShadow = GetRValue(m_crLiteShadow);
BYTE byGreen3DDkShadow = GetGValue(m_crDkShadow);
BYTE byGreen3DLiteShadow = GetGValue(m_crLiteShadow);
BYTE byBlue3DDkShadow = GetBValue(m_crDkShadow);
BYTE byBlue3DLiteShadow = GetBValue(m_crLiteShadow);
m_crShadow = RGB(byRed3DLiteShadow + ((byRed3DDkShadow - byRed3DLiteShadow) >> 1),
byGreen3DLiteShadow + ((byGreen3DDkShadow - byGreen3DLiteShadow) >> 1),
byBlue3DLiteShadow + ((byBlue3DDkShadow - byBlue3DLiteShadow) >> 1));
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void C3DBar::DrawHorizontal(CDC *pDC, CRect &BarRect)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
if (!BarRect.Width()) return;
CBrush brLightest(m_crColorLightest);
pDC->FillRect(BarRect, &brLightest);
int nLeft = BarRect.left;
int nTop = BarRect.top;
int nBottom = BarRect.bottom;
int nRight = BarRect.right;
CPen *pOldPen = pDC->SelectObject(&m_penColorLight);
{
pDC->MoveTo(nLeft + 2, nBottom - 4);
pDC->LineTo(nRight - 2, nBottom - 4);
pDC->MoveTo(nLeft + 2, nTop + 2);
pDC->LineTo(nRight - 2, nTop + 2);
pDC->SetPixel(nLeft + 1, nBottom - 3, m_crColorLight);
pDC->SetPixel(nLeft + 1, nTop + 1, m_crColorLight);
}
pDC->SelectObject(&m_penColorLighter);
{
pDC->MoveTo(nLeft + 2, nBottom - 5);
pDC->LineTo(nRight - 3, nBottom - 5);
pDC->LineTo(nRight - 3, nTop + 3);
pDC->LineTo(nLeft + 1, nTop + 3);
pDC->SetPixel(nLeft + 1, nBottom - 4, m_crColorLighter);
pDC->SetPixel(nLeft + 1, nTop + 2, m_crColorLighter);
}
pDC->SelectObject(&m_penColor);
{
pDC->MoveTo(nLeft, nBottom - 1);
pDC->LineTo(nLeft, nTop);
pDC->LineTo(nLeft + 2, nTop);
pDC->SetPixel(nLeft + 1, nBottom - 2, m_crChannel);
pDC->MoveTo(nLeft + 2, nBottom - 3);
pDC->LineTo(nRight - 2, nBottom - 3);
pDC->MoveTo(nLeft + 2, nTop + 1);
pDC->LineTo(nRight - 1, nTop + 1);
}
pDC->SelectObject(&m_penColorDark);
{
pDC->MoveTo(nLeft + 2, nBottom - 2);
pDC->LineTo(nRight - 2, nBottom - 2);
pDC->LineTo(nRight - 2, nTop + 1);
pDC->MoveTo(nLeft + 2, nTop);
pDC->LineTo(nRight, nTop);
pDC->SetPixel(nLeft + 1, nBottom - 1, m_crColorDark);
}
pDC->SelectObject(&m_penColorDarker);
{
pDC->MoveTo(nLeft + 2, nBottom - 1);
pDC->LineTo(nRight - 1, nBottom - 1);
pDC->LineTo(nRight - 1, nTop);
}
pDC->SelectObject(&m_penShadow);
{
pDC->MoveTo(nRight, nTop);
pDC->LineTo(nRight, nBottom);
}
pDC->SelectObject(&m_penLiteShadow);
{
pDC->MoveTo(nRight + 1, nTop);
pDC->LineTo(nRight + 1, nBottom);
}
pDC->SelectObject(pOldPen);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void C3DBar::DeletePens()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
if (m_penColorLight.m_hObject) m_penColorLight.DeleteObject();
if (m_penColorLighter.m_hObject) m_penColorLighter.DeleteObject();
if (m_penColor.m_hObject) m_penColor.DeleteObject();
if (m_penColorDark.m_hObject) m_penColorDark.DeleteObject();
if (m_penColorDarker.m_hObject) m_penColorDarker.DeleteObject();
if (m_penDkShadow.m_hObject) m_penDkShadow.DeleteObject();
if (m_penShadow.m_hObject) m_penShadow.DeleteObject();
if (m_penLiteShadow.m_hObject) m_penLiteShadow.DeleteObject();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void C3DBar::CreatePens()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
DeletePens();
m_penColorLight.CreatePen(PS_SOLID, 1, m_crColorLight);
m_penColorLighter.CreatePen(PS_SOLID, 1, m_crColorLighter);
m_penColor.CreatePen(PS_SOLID, 1, m_crChannel);
m_penColorDark.CreatePen(PS_SOLID, 1, m_crColorDark);
m_penColorDarker.CreatePen(PS_SOLID, 1, m_crColorDarker);
m_penDkShadow.CreatePen(PS_SOLID, 1, m_crDkShadow);
m_penShadow.CreatePen(PS_SOLID, 1, m_crShadow);
m_penLiteShadow.CreatePen(PS_SOLID, 1, m_crLiteShadow);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
COLORREF C3DBar::LightenColor(const COLORREF crColor, BYTE byIncreaseVal)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
BYTE byRed = GetRValue(crColor);
BYTE byGreen = GetGValue(crColor);
BYTE byBlue = GetBValue(crColor);
if ((byRed + byIncreaseVal) <= 255)
byRed = BYTE(byRed + byIncreaseVal);
if ((byGreen + byIncreaseVal) <= 255)
byGreen = BYTE(byGreen + byIncreaseVal);
if ((byBlue + byIncreaseVal) <= 255)
byBlue = BYTE(byBlue + byIncreaseVal);
return RGB(byRed, byGreen, byBlue);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
COLORREF C3DBar::DarkenColor(const COLORREF crColor, BYTE byReduceVal)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
BYTE byRed = GetRValue(crColor);
BYTE byGreen = GetGValue(crColor);
BYTE byBlue = GetBValue(crColor);
if (byRed >= byReduceVal)
byRed = BYTE(byRed - byReduceVal);
if (byGreen >= byReduceVal)
byGreen = BYTE(byGreen - byReduceVal);
if (byBlue >= byReduceVal)
byBlue = BYTE(byBlue - byReduceVal);
return RGB(byRed, byGreen, byBlue);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Function Header
void C3DBar::SetBarColour(COLORREF cr)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
m_crChannel = cr;
UpdateColours();
CreatePens();
}