High-speed-Charting-Control/ChartDemo/ChartCtrl/ChartGradient.cpp

128 lines
3.7 KiB
C++

/*
*
* ChartGradient.cpp
*
* Written by Cédric Moonen (cedric_moonen@hotmail.com)
*
*
*
* This code may be used for any non-commercial and commercial purposes in a compiled form.
* The code may be redistributed as long as it remains unmodified and providing that the
* author name and this disclaimer remain intact. The sources can be modified WITH the author
* consent only.
*
* This code is provided without any garanties. I cannot be held responsible for the damage or
* the loss of time it causes. Use it at your own risks
*
* An e-mail to notify me that you are using this code is appreciated also.
*
*
*/
#include "stdafx.h"
#include "ChartGradient.h"
CChartGradient::CChartGradient()
{
}
CChartGradient::~CChartGradient()
{
}
void CChartGradient::DrawGradient(CDC* pDC, const CRect& GradientRect, COLORREF Color1,
COLORREF Color2, EGradientType GradientType)
{
#if _MFC_VER > 0x0600
if ( (GradientType == gtHorizontal) || (GradientType == gtVertical) )
{
TRIVERTEX vertex[2] ;
vertex[0].x = GradientRect.left;
vertex[0].y = GradientRect.top;
vertex[0].Red = ((COLOR16)GetRValue(Color1))<<8;
vertex[0].Green = ((COLOR16)GetGValue(Color1))<<8;
vertex[0].Blue = ((COLOR16)GetBValue(Color1))<<8;
vertex[0].Alpha = 0x0000;
vertex[1].x = GradientRect.right;
vertex[1].y = GradientRect.bottom;
vertex[1].Red = ((COLOR16)GetRValue(Color2))<<8;
vertex[1].Green = ((COLOR16)GetGValue(Color2))<<8;
vertex[1].Blue = ((COLOR16)GetBValue(Color2))<<8;
vertex[1].Alpha = 0x0000;
GRADIENT_RECT gRect;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
if (GradientType == gtHorizontal)
pDC->GradientFill(vertex,2,&gRect,1,GRADIENT_FILL_RECT_H);
else
pDC->GradientFill(vertex,2,&gRect,1,GRADIENT_FILL_RECT_V);
}
else
{
for (int i=0;i<2; i++)
{
TRIVERTEX vertex[2] ;
if (GradientType == gtHorizontalDouble)
{
vertex[0].x = GradientRect.left + (GradientRect.Width()/2) * i;
vertex[0].y = GradientRect.top;
}
else
{
vertex[0].x = GradientRect.left;
vertex[0].y = GradientRect.top + (GradientRect.Height()/2) * i;
}
if (i==0)
{
vertex[0].Red = ((COLOR16)GetRValue(Color1))<<8;
vertex[0].Green = ((COLOR16)GetGValue(Color1))<<8;
vertex[0].Blue = ((COLOR16)GetBValue(Color1))<<8;
}
else
{
vertex[0].Red = ((COLOR16)GetRValue(Color2))<<8;
vertex[0].Green = ((COLOR16)GetGValue(Color2))<<8;
vertex[0].Blue = ((COLOR16)GetBValue(Color2))<<8;
}
vertex[0].Alpha = 0x0000;
if (GradientType == gtHorizontalDouble)
{
vertex[1].x = GradientRect.left + (GradientRect.Width()/2) * (i+1);
vertex[1].y = GradientRect.bottom;
}
else
{
vertex[1].x = GradientRect.right;
vertex[1].y = GradientRect.top + (GradientRect.Height()/2) * (i+1);
}
if (i==0)
{
vertex[1].Red = ((COLOR16)GetRValue(Color2))<<8;
vertex[1].Green = ((COLOR16)GetGValue(Color2))<<8;
vertex[1].Blue = ((COLOR16)GetBValue(Color2))<<8;
}
else
{
vertex[1].Red = ((COLOR16)GetRValue(Color1))<<8;
vertex[1].Green = ((COLOR16)GetGValue(Color1))<<8;
vertex[1].Blue = ((COLOR16)GetBValue(Color1))<<8;
}
vertex[1].Alpha = 0x0000;
GRADIENT_RECT gRect;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
if (GradientType == gtHorizontalDouble)
pDC->GradientFill(vertex,2,&gRect,1,GRADIENT_FILL_RECT_H);
else
pDC->GradientFill(vertex,2,&gRect,1,GRADIENT_FILL_RECT_V);
}
}
#else
CBrush NewBrush(Color1);
pDC->FillRect(GradientRect,&NewBrush);
DeleteObject(NewBrush);
#endif
}