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.
253 lines
8.0 KiB
C++
253 lines
8.0 KiB
C++
// XTPChartCandleStickSeriesStyle.cpp
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Common/XTPPropExchange.h"
|
|
|
|
#include "../../Types/XTPChartTypes.h"
|
|
#include "Common/Base/Types/XTPPoint3.h"
|
|
|
|
#include "../../XTPChartDefines.h"
|
|
#include "../../XTPChartElement.h"
|
|
#include <Chart/XTPChartLegendItem.h>
|
|
#include "../../XTPChartElementView.h"
|
|
#include "../../XTPChartSeriesStyle.h"
|
|
#include <Chart/XTPChartSeriesPointView.h>
|
|
#include "../../XTPChartSeriesView.h"
|
|
#include "../../XTPChartSeriesPoint.h"
|
|
|
|
#include "../../Diagram/Axis/XTPChartAxisView.h"
|
|
#include "../../Diagram/Diagram2D/XTPChartDiagram2DSeriesStyle.h"
|
|
#include "../../Diagram/Diagram2D/XTPChartDiagram2DSeriesView.h"
|
|
|
|
#include "../../Drawing/XTPChartDeviceCommand.h"
|
|
#include "../../Drawing/XTPChartRectangleDeviceCommand.h"
|
|
#include "../../Drawing/XTPChartLineDeviceCommand.h"
|
|
|
|
#include "XTPChartHighLowSeriesStyle.h"
|
|
#include "XTPChartCandleStickSeriesStyle.h"
|
|
|
|
enum ValueIndex
|
|
{
|
|
chartLow,
|
|
chartHigh,
|
|
chartOpen,
|
|
chartClose
|
|
};
|
|
|
|
IMPLEMENT_SERIAL(CXTPChartCandleStickSeriesStyle, CXTPChartHighLowSeriesStyle, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPChartCandleStickSeriesStyle
|
|
|
|
CXTPChartCandleStickSeriesStyle::CXTPChartCandleStickSeriesStyle()
|
|
{
|
|
}
|
|
|
|
CXTPChartCandleStickSeriesStyle::~CXTPChartCandleStickSeriesStyle()
|
|
{
|
|
|
|
}
|
|
|
|
CXTPChartSeriesView* CXTPChartCandleStickSeriesStyle::CreateView(CXTPChartSeries* pSeries, CXTPChartDiagramView* pDiagramView)
|
|
{
|
|
return new CXTPChartCandleStickSeriesView(pSeries, pDiagramView);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPChartCandleStickSeriesView
|
|
|
|
CXTPChartCandleStickSeriesView::CXTPChartCandleStickSeriesView(CXTPChartSeries* pSeries, CXTPChartDiagramView* pDiagramView)
|
|
: CXTPChartDiagram2DSeriesView(pSeries,pDiagramView)
|
|
{
|
|
|
|
}
|
|
CXTPChartSeriesPointView* CXTPChartCandleStickSeriesView::CreateSeriesPointView(CXTPChartDeviceContext* pDC, CXTPChartSeriesPoint* pPoint, CXTPChartElementView* pParentView)
|
|
{
|
|
UNREFERENCED_PARAMETER(pDC);
|
|
return new CXTPChartCandleStickSeriesPointView(pPoint, pParentView);
|
|
}
|
|
|
|
|
|
CXTPChartDeviceCommand* CXTPChartCandleStickSeriesView::CreateLegendDeviceCommand(CXTPChartDeviceContext* pDC, CRect rcBounds)
|
|
{
|
|
UNREFERENCED_PARAMETER(pDC);
|
|
rcBounds.DeflateRect(1, 1);
|
|
|
|
CXTPChartDeviceCommand* pCommand = new CXTPChartDeviceCommand();
|
|
|
|
CXTPChartHighLowSeriesStyle* pStyle = STATIC_DOWNCAST(CXTPChartHighLowSeriesStyle, GetStyle());
|
|
|
|
CPoint ptCenter(rcBounds.CenterPoint().x, rcBounds.CenterPoint().y) ;
|
|
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
CXTPChartColor color = i == 0 ? pStyle->GetUpColor() : pStyle->GetDownColor();
|
|
|
|
int nHeight = rcBounds.Height() - 3;
|
|
int x = i == 0 ? ptCenter.x - 4 : ptCenter.x + 4;
|
|
int y = i == 0 ? rcBounds.top : rcBounds.top + 3;
|
|
|
|
CXTPPoint2i pointHight(x, y);
|
|
CXTPPoint2i pointLow(x, pointHight.Y + nHeight);
|
|
CXTPPoint2i pointOpen(x, pointHight.Y + nHeight / 3);
|
|
CXTPPoint2i pointClose(x, pointHight.Y + nHeight * 2 / 3);
|
|
int nWidth = 6;
|
|
|
|
CXTPChartRectF rc((float)pointOpen.X - nWidth / 2.0f, (float)pointOpen.Y, (float)nWidth, (float)pointClose.Y - pointOpen.Y);
|
|
rc.X += 2 / 2.0f;
|
|
rc.Width -= 2;
|
|
pCommand->AddChildCommand(new CXTPChartBoundedRectangleDeviceCommand(rc, color, 2));
|
|
|
|
pCommand->AddChildCommand(new CXTPChartSolidLineDeviceCommand(
|
|
CXTPChartPointF(pointHight), CXTPChartPointF((float)pointHight.X, (float)min(pointOpen.Y, pointClose.Y)), color, 2));
|
|
|
|
pCommand->AddChildCommand(new CXTPChartSolidLineDeviceCommand(
|
|
CXTPChartPointF(pointLow), CXTPChartPointF((float)pointHight.X, (float)max(pointOpen.Y, pointClose.Y)), color, 2));
|
|
|
|
}
|
|
|
|
return pCommand;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPChartCandleStickSeriesPointView
|
|
|
|
CXTPChartCandleStickSeriesPointView::CXTPChartCandleStickSeriesPointView(CXTPChartSeriesPoint* pPoint, CXTPChartElementView* pParentView)
|
|
: CXTPChartSeriesPointView(pPoint, pParentView)
|
|
{
|
|
|
|
}
|
|
|
|
CXTPChartPointF CXTPChartCandleStickSeriesPointView::GetScreenPoint(int nIndex)
|
|
{
|
|
CXTPChartCandleStickSeriesView* pView = (CXTPChartCandleStickSeriesView*)GetSeriesView();
|
|
|
|
return pView->GetScreenPoint(m_pPoint->GetInternalArgumentValue(), m_pPoint->GetValue(nIndex));
|
|
}
|
|
|
|
|
|
CXTPChartDeviceCommand* CXTPChartCandleStickSeriesPointView::CreateDeviceCommand(CXTPChartDeviceContext* pDC)
|
|
{
|
|
UNREFERENCED_PARAMETER(pDC);
|
|
|
|
CXTPPoint2i pointOpen = GetScreenPoint(chartOpen).Round();
|
|
CXTPPoint2i pointClose = GetScreenPoint(chartClose).Round();
|
|
|
|
CXTPPoint2i pointLow = GetScreenPoint(chartLow).Round();
|
|
CXTPPoint2i pointHight = GetScreenPoint(chartHigh).Round();
|
|
|
|
BOOL bUpColor = TRUE;
|
|
BOOL bFilled = TRUE;
|
|
|
|
if (pointOpen.Y > pointClose.Y)
|
|
{
|
|
CXTPPoint2i p = pointClose;
|
|
pointClose = pointOpen;
|
|
pointOpen = p;
|
|
bFilled = FALSE;
|
|
}
|
|
|
|
CXTPChartSeriesPoint* pPrevPoint = m_pPoint->GetPreviousPoint();
|
|
if (pPrevPoint)
|
|
{
|
|
if (pPrevPoint->GetValue(chartClose) > m_pPoint->GetValue(chartClose))
|
|
{
|
|
bUpColor = FALSE;
|
|
}
|
|
}
|
|
CXTPChartCandleStickSeriesView* pView = (CXTPChartCandleStickSeriesView*)GetSeriesView();
|
|
|
|
|
|
CXTPChartDiagram2DAxisView* pAxisView = pView->GetAxisViewX();
|
|
CXTPChartCandleStickSeriesStyle* pStyle = (CXTPChartCandleStickSeriesStyle*)GetSeriesView()->GetStyle();
|
|
|
|
|
|
int nWidth = (int)(pAxisView->DistanceToPoint(1) * 0.5);
|
|
if (nWidth < 5)
|
|
nWidth = 5;
|
|
|
|
int nLineThickness = pStyle->GetLineThickness();
|
|
|
|
nWidth = (nWidth & ~1) + nLineThickness;
|
|
|
|
|
|
CXTPChartDeviceCommand* pCommand = new CXTPChartHitTestElementCommand(m_pPoint);
|
|
|
|
CXTPChartRectF rc((float)pointOpen.X - nWidth / 2.0f, (float)pointOpen.Y, (float)nWidth, (float)pointClose.Y - pointOpen.Y);
|
|
if (rc.Height < nLineThickness)
|
|
{
|
|
rc.Height = (float)nLineThickness;
|
|
rc.Y -= (float)nLineThickness / 2;
|
|
}
|
|
|
|
CXTPChartColor color = bUpColor ? pStyle->GetUpColor() : pStyle->GetDownColor();
|
|
|
|
if (bFilled)
|
|
{
|
|
pCommand->AddChildCommand(new CXTPChartSolidRectangleDeviceCommand(rc, color));
|
|
}
|
|
else
|
|
{
|
|
rc.X += nLineThickness / 2.0f;
|
|
rc.Width -= nLineThickness;
|
|
pCommand->AddChildCommand(new CXTPChartBoundedRectangleDeviceCommand(rc, color, nLineThickness));
|
|
}
|
|
|
|
|
|
pCommand->AddChildCommand(new CXTPChartSolidLineDeviceCommand(
|
|
CXTPChartPointF(pointHight), CXTPChartPointF((float)pointHight.X, (float)min(pointOpen.Y, pointClose.Y)), color, nLineThickness));
|
|
|
|
pCommand->AddChildCommand(new CXTPChartSolidLineDeviceCommand(
|
|
CXTPChartPointF(pointLow), CXTPChartPointF((float)pointHight.X, (float)max(pointOpen.Y, pointClose.Y)), color, nLineThickness));
|
|
|
|
return pCommand;
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef _XTP_ACTIVEX
|
|
|
|
|
|
|
|
BEGIN_DISPATCH_MAP(CXTPChartCandleStickSeriesStyle, CXTPChartHighLowSeriesStyle)
|
|
END_DISPATCH_MAP()
|
|
|
|
|
|
// {442BCC77-27BF-4cb1-9ABF-4558D9835223}
|
|
static const GUID IID_IChartCandleStickSeriesStyle =
|
|
{ 0x442bcc77, 0x27bf, 0x4cb1, { 0x9a, 0xbf, 0x45, 0x58, 0xd9, 0x83, 0x52, 0x23 } };
|
|
|
|
BEGIN_INTERFACE_MAP(CXTPChartCandleStickSeriesStyle, CXTPChartHighLowSeriesStyle)
|
|
INTERFACE_PART(CXTPChartCandleStickSeriesStyle, IID_IChartCandleStickSeriesStyle, Dispatch)
|
|
END_INTERFACE_MAP()
|
|
|
|
IMPLEMENT_OLETYPELIB_EX(CXTPChartCandleStickSeriesStyle, IID_IChartCandleStickSeriesStyle)
|
|
|
|
// {44490E6F-92B6-4671-9613-6B2A0FBF80A8}
|
|
IMPLEMENT_OLECREATE_EX2(CXTPChartCandleStickSeriesStyle, "Codejock.ChartCandleStickSeriesStyle." _XTP_AXLIB_VERSION,
|
|
0x44490e6f, 0x92b6, 0x4671, 0x96, 0x13, 0x6b, 0x2a, 0xf, 0xbf, 0x80, 0xa8);
|
|
|
|
|
|
#endif
|