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++
212 lines
8.8 KiB
C++
7 months ago
|
// 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();
|
||
|
}
|