⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawtech.cpp

📁 股票软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// DrawTech.cpp : implementation of the CStockGraph class
//

#include "stdafx.h"
#include "StockGraph.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////////////////////////////////////
// Draw Technical Utilities

COLORREF	GetLineColor( int nIndex )
{
	int	nColor	=	nIndex % 6;
	if( 0 == nColor )
		return AfxGetProfile().GetColor(CColorClass::clrLine1);
	else if( 1 == nColor )
		return AfxGetProfile().GetColor(CColorClass::clrLine2);
	else if( 2 == nColor )
		return AfxGetProfile().GetColor(CColorClass::clrLine3);
	else if( 3 == nColor )
		return AfxGetProfile().GetColor(CColorClass::clrLine4);
	else if( 4 == nColor )
		return AfxGetProfile().GetColor(CColorClass::clrLine5);
	else
		return AfxGetProfile().GetColor(CColorClass::clrLine6);
}

void CStockGraph::DrawTechUtil( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
							   int nTech, CTechnique * pTech, CKData * pKData, CSPDWordArray & adwDays )
{
	CHECK_NODATATODRAW
	DECLARE_COLOR_DEFINATION

	// Draw Sub Title, Param Value
	if( bDrawTitle )
	{
		pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );

		DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );

		CFont	* pOldFont	=	AfxSelectDCFont( pDC, 12 );
		pDC->SetBkColor( clrBK );
		int	nIndexParam	=	( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
		double	dParam = dMin;
		CString	strText;
		for( int k=0; k<adwDays.GetSize(); k++ )
		{
			if( pTech->Calculate( &dParam, nIndexParam, adwDays[k], FALSE ) )
			{
				strText.Format( "%d%s %.2f", adwDays[k], (LPCTSTR)(AfxGetSTTShortName(nTech)), dParam );
				pDC->SetTextColor( GetLineColor( k ) );
				if( rect.left+m_nWidthSubtitle+(k+1)*m_nWidthParameter > rect.right )
					break;
				pDC->TextOut( rect.left+m_nWidthSubtitle+k*m_nWidthParameter, rect.top+1, strText );
			}
		}
		pDC->SelectObject( pOldFont );
		return;
	}

	if( dMax - dMin < 1e-4 )
		return;

	// Draw
	for( int k=0; k<adwDays.GetSize(); k++ )
	{
		int	yLast, yNow;
		BOOL	bHasLast = FALSE;
		double	dNow = dMin;
		for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
		{
			// Prepare Rect 
			CRect	rectK;
			long	xMedium	=	0;
			if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
				continue;

			// Draw
			if( pTech->Calculate( &dNow, nIndex, adwDays[k], bHasLast ) )
			{
				yNow	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow  - dMin) / (dMax-dMin) );
				if( bHasLast )
				{
					if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
						|| yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
						continue;
					CPen	penLocal( PS_SOLID, 1, GetLineColor(k) );
					CPen * pOldPen = pDC->SelectObject( &penLocal );
					pDC->MoveTo( xMedium-m_nThickness, yLast );
					pDC->LineTo( xMedium, yNow );
					pDC->SelectObject( pOldPen );
				}
				yLast		=	yNow;
				bHasLast	=	TRUE;
			}
		}
	}
}

void CStockGraph::DrawTechUtil1( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
							   int nTech, CTechnique * pTech, CKData * pKData,
							   COLORREF clrLine, int nDrawTechType )
{
	CHECK_NODATATODRAW
	DECLARE_COLOR_DEFINATION

	ASSERT( drawtechtype_line == nDrawTechType || drawtechtype_dot == nDrawTechType );

	// Draw Sub Title, Param Value
	if( bDrawTitle )
	{
		pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );

		DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );

		CFont	* pOldFont	=	AfxSelectDCFont( pDC, 12 );
		pDC->SetBkColor( clrBK );
		int	nIndexParam	=	( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
		double	dParam = dMin;
		CString	strText;
		if( pTech->Calculate( &dParam, nIndexParam, FALSE ) )
		{
			strText.Format( "%s  %.2f", (LPCTSTR)(AfxGetSTTShortName(nTech)), dParam );
			pDC->SetTextColor( clrLine );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
		}
		pDC->SelectObject( pOldFont );
		return;
	}

	if( dMax - dMin < 1e-4 )
		return;

	// Draw
	int	yLast, yNow;
	BOOL	bHasLast = FALSE;
	double	dNow = dMin;
	for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
	{
		// Prepare Rect 
		CRect	rectK;
		long	xMedium	=	0;
		if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
			continue;

		// Draw
		if( pTech->Calculate( &dNow, nIndex, bHasLast ) )
		{
			yNow	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow  - dMin) / (dMax-dMin) );
			if( bHasLast )
			{
				if( yLast > rect.bottom || yLast < rect.top+m_nHeightSubtitle
					|| yNow > rect.bottom || yNow < rect.top+m_nHeightSubtitle )
					continue;
				CPen	penLocal( PS_SOLID, 1, clrLine );
				CPen * pOldPen = pDC->SelectObject( &penLocal );
				if( drawtechtype_line == nDrawTechType )
				{
					pDC->MoveTo( xMedium-m_nThickness, yLast );
					pDC->LineTo( xMedium, yNow );
				}
				else if( drawtechtype_dot == nDrawTechType )
				{
					pDC->Ellipse( xMedium-2, yNow-2, xMedium+2, yNow+2 );
				}
				pDC->SelectObject( pOldPen );
			}
			yLast		=	yNow;
			bHasLast	=	TRUE;
		}
	}
}

void CStockGraph::DrawTechUtil2( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
							   int nTech, CTechnique * pTech, CKData * pKData,
							   COLORREF clrLine1, COLORREF clrLine2,
							   CString strTitle1, CString strTitle2 )
{
	CHECK_NODATATODRAW
	DECLARE_COLOR_DEFINATION

	// Draw Sub Title, Param Value
	if( bDrawTitle )
	{
		pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );

		DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );

		CFont	* pOldFont	=	AfxSelectDCFont( pDC, 12 );
		pDC->SetBkColor( clrBK );
		int	nIndexParam	=	( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
		double	dParam1 = dMin, dParam2 = dMin;
		CString	strText;
		if( pTech->Calculate( &dParam1, &dParam2, nIndexParam, FALSE ) )
		{
			strText.Format( "%s %.2f", strTitle1, dParam1 );
			pDC->SetTextColor( clrLine1 );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );

			strText.Format( "%s %.2f", strTitle2, dParam2 );
			pDC->SetTextColor( clrLine2 );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
		}
		pDC->SelectObject( pOldFont );
		return;
	}

	if( dMax - dMin < 1e-4 )
		return;

	// Draw
	int	yLast1, yNow1, yLast2, yNow2;
	BOOL	bHasLast = FALSE;
	double	dNow1 = dMin, dNow2 = dMin;
	for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
	{
		// Prepare Rect 
		CRect	rectK;
		long	xMedium	=	0;
		if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
			continue;

		// Draw
		if( pTech->Calculate( &dNow1, &dNow2, nIndex, bHasLast ) )
		{
			yNow1	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
			yNow2	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
			if( bHasLast )
			{
				if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
					|| yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
					continue;
				if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
					|| yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
					continue;
				CPen	penLocal1( PS_SOLID, 1, clrLine1 );
				CPen * pOldPen = pDC->SelectObject( &penLocal1 );
				pDC->MoveTo( xMedium-m_nThickness, yLast1 );
				pDC->LineTo( xMedium, yNow1 );

				CPen	penLocal2( PS_SOLID, 1, clrLine2 );
				pDC->SelectObject( &penLocal2 );
				pDC->MoveTo( xMedium-m_nThickness, yLast2 );
				pDC->LineTo( xMedium, yNow2 );
				pDC->SelectObject( pOldPen );
			}
			yLast1		=	yNow1;
			yLast2		=	yNow2;
			bHasLast	=	TRUE;
		}
	}
}

void CStockGraph::DrawTechUtil3( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
							   int nTech, CTechnique * pTech, CKData * pKData,
							   COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3,
							   CString strTitle1, CString strTitle2, CString strTitle3 )
{
	CHECK_NODATATODRAW
	DECLARE_COLOR_DEFINATION

	// Draw Sub Title, Param Value
	if( bDrawTitle )
	{
		pDC->FillSolidRect( CRect( rect.left+1, rect.top+1, rect.right-1, rect.top+m_nHeightSubtitle-1 ), clrBK );
		
		DrawTechTitle( pDC, rect.left+5, rect.top+1, AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );

		CFont	* pOldFont	=	AfxSelectDCFont( pDC, 12 );
		pDC->SetBkColor( clrBK );
		int	nIndexParam	=	( m_nIndexCurrent >= 0 ? m_nIndexCurrent : pKData->GetSize()-1 );
		double	dParam1 = dMin, dParam2 = dMin, dParam3 = dMin;
		CString	strText;
		if( pTech->Calculate( &dParam1, &dParam2, &dParam3, nIndexParam, FALSE ) )
		{
			strText.Format( "%s %.2f", strTitle1, dParam1 );
			pDC->SetTextColor( clrLine1 );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );

			strText.Format( "%s %.2f", strTitle2, dParam2 );
			pDC->SetTextColor( clrLine2 );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter*2 < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter, rect.top+1, strText );
			
			strText.Format( "%s %.2f", strTitle3, dParam3 );
			pDC->SetTextColor( clrLine3 );
			if( rect.left+m_nWidthSubtitle+m_nWidthParameter*3 < rect.right )
				pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
		}
		pDC->SelectObject( pOldFont );
		return;
	}

	if( dMax - dMin < 1e-4 )
		return;

	// Draw
	int	yLast1, yNow1, yLast2, yNow2, yLast3, yNow3;
	BOOL	bHasLast = FALSE;
	double	dNow1 = dMin, dNow2 = dMin, dNow3 = dMin;
	for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
	{
		// Prepare Rect 
		CRect	rectK;
		long	xMedium	=	0;
		if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
			continue;

		// Draw
		if( pTech->Calculate( &dNow1, &dNow2, &dNow3, nIndex, bHasLast ) )
		{
			yNow1	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow1 - dMin) / (dMax-dMin) );
			yNow2	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow2 - dMin) / (dMax-dMin) );
			yNow3	=	int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow3 - dMin) / (dMax-dMin) );
			if( bHasLast )
			{
				if( yLast1 > rect.bottom || yLast1 < rect.top+m_nHeightSubtitle
					|| yNow1 > rect.bottom || yNow1 < rect.top+m_nHeightSubtitle )
					continue;
				if( yLast2 > rect.bottom || yLast2 < rect.top+m_nHeightSubtitle
					|| yNow2 > rect.bottom || yNow2 < rect.top+m_nHeightSubtitle )
					continue;
				if( yLast3 > rect.bottom || yLast3 < rect.top+m_nHeightSubtitle
					|| yNow3 > rect.bottom || yNow3 < rect.top+m_nHeightSubtitle )
					continue;
				CPen	penLocal1( PS_SOLID, 1, clrLine1 );
				CPen * pOldPen = pDC->SelectObject( &penLocal1 );
				pDC->MoveTo( xMedium-m_nThickness, yLast1 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -