📄 drawtech.cpp
字号:
// 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 + -