📄 drawtech.cpp
字号:
pDC->LineTo( xMedium, yNow1 );
CPen penLocal2( PS_SOLID, 1, clrLine2 );
pDC->SelectObject( &penLocal2 );
pDC->MoveTo( xMedium-m_nThickness, yLast2 );
pDC->LineTo( xMedium, yNow2 );
CPen penLocal3( PS_SOLID, 1, clrLine3 );
pDC->SelectObject( &penLocal3 );
pDC->MoveTo( xMedium-m_nThickness, yLast3 );
pDC->LineTo( xMedium, yNow3 );
pDC->SelectObject( pOldPen );
}
yLast1 = yNow1;
yLast2 = yNow2;
yLast3 = yNow3;
bHasLast = TRUE;
}
}
}
void CStockGraph::DrawTechUtil4( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
int nTech, CTechnique * pTech, CKData * pKData,
COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3, COLORREF clrLine4,
CString strTitle1, CString strTitle2, CString strTitle3, CString strTitle4 )
{
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, dParam4 = dMin;
CString strText;
if( pTech->Calculate( &dParam1, &dParam2, &dParam3, &dParam4, 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 );
strText.Format( "%s %.2f", strTitle4, dParam4 );
pDC->SetTextColor( clrLine4 );
if( rect.left+m_nWidthSubtitle+m_nWidthParameter*4 < rect.right )
pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*3, rect.top+1, strText );
}
pDC->SelectObject( pOldFont );
return;
}
if( dMax - dMin < 1e-4 )
return;
// Draw
int yLast1, yNow1, yLast2, yNow2, yLast3, yNow3, yLast4, yNow4;
BOOL bHasLast = FALSE;
double dNow1 = dMin, dNow2 = dMin, dNow3 = dMin, dNow4 = 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, &dNow4, 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) );
yNow4 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow4 - 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;
if( yLast4 > rect.bottom || yLast4 < rect.top+m_nHeightSubtitle
|| yNow4 > rect.bottom || yNow4 < 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 );
CPen penLocal3( PS_SOLID, 1, clrLine3 );
pDC->SelectObject( &penLocal3 );
pDC->MoveTo( xMedium-m_nThickness, yLast3 );
pDC->LineTo( xMedium, yNow3 );
CPen penLocal4( PS_SOLID, 1, clrLine4 );
pDC->SelectObject( &penLocal4 );
pDC->MoveTo( xMedium-m_nThickness, yLast4 );
pDC->LineTo( xMedium, yNow4 );
pDC->SelectObject( pOldPen );
}
yLast1 = yNow1;
yLast2 = yNow2;
yLast3 = yNow3;
yLast4 = yNow4;
bHasLast = TRUE;
}
}
}
void CStockGraph::DrawTechUtil5( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax,
int nTech, CTechnique * pTech, CKData * pKData,
COLORREF clrLine1, COLORREF clrLine2, COLORREF clrLine3, COLORREF clrLine4, COLORREF clrLine5,
CString strTitle1, CString strTitle2, CString strTitle3, CString strTitle4, CString strTitle5 )
{
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, dParam4 = dMin, dParam5 = dMin;
CString strText;
if( pTech->Calculate( &dParam1, &dParam2, &dParam3, &dParam4, &dParam5, 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 );
strText.Format( "%s %.2f", strTitle4, dParam4 );
pDC->SetTextColor( clrLine4 );
if( rect.left+m_nWidthSubtitle+m_nWidthParameter*4 < rect.right )
pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*3, rect.top+1, strText );
strText.Format( "%s %.2f", strTitle5, dParam5 );
pDC->SetTextColor( clrLine5 );
if( rect.left+m_nWidthSubtitle+m_nWidthParameter*5 < rect.right )
pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*4, rect.top+1, strText );
}
pDC->SelectObject( pOldFont );
return;
}
if( dMax - dMin < 1e-4 )
return;
// Draw
int yLast1, yNow1, yLast2, yNow2, yLast3, yNow3, yLast4, yNow4, yLast5, yNow5;
BOOL bHasLast = FALSE;
double dNow1 = dMin, dNow2 = dMin, dNow3 = dMin, dNow4 = dMin, dNow5 = 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, &dNow4, &dNow5, 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) );
yNow4 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow4 - dMin) / (dMax-dMin) );
yNow5 = int( rect.bottom - (rect.Height()-m_nHeightSubtitle-2) * (dNow5 - 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;
if( yLast4 > rect.bottom || yLast4 < rect.top+m_nHeightSubtitle
|| yNow4 > rect.bottom || yNow4 < rect.top+m_nHeightSubtitle )
continue;
if( yLast5 > rect.bottom || yLast5 < rect.top+m_nHeightSubtitle
|| yNow5 > rect.bottom || yNow5 < 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 );
CPen penLocal3( PS_SOLID, 1, clrLine3 );
pDC->SelectObject( &penLocal3 );
pDC->MoveTo( xMedium-m_nThickness, yLast3 );
pDC->LineTo( xMedium, yNow3 );
CPen penLocal4( PS_SOLID, 1, clrLine4 );
pDC->SelectObject( &penLocal4 );
pDC->MoveTo( xMedium-m_nThickness, yLast4 );
pDC->LineTo( xMedium, yNow4 );
CPen penLocal5( PS_SOLID, 1, clrLine5 );
pDC->SelectObject( &penLocal5 );
pDC->MoveTo( xMedium-m_nThickness, yLast5 );
pDC->LineTo( xMedium, yNow5 );
pDC->SelectObject( pOldPen );
}
yLast1 = yNow1;
yLast2 = yNow2;
yLast3 = yNow3;
yLast4 = yNow4;
yLast5 = yNow5;
bHasLast = TRUE;
}
}
}
////////////////////////////////////////////////////////////
// KLine Technical Attributes
void CStockGraph::DrawTechMA( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.ma.AttachParameters( AfxGetProfile().GetTechParameters().ma );
DrawTechUtil( pDC, rect, bDrawTitle, dMin, dMax, STT_MA, &(m_techparam.ma), &kdata, m_techparam.ma.m_adwMADays );
}
void CStockGraph::DrawTechBBI( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.bbi.AttachParameters( AfxGetProfile().GetTechParameters().bbi );
DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_BBI, &(m_techparam.bbi), &kdata,
AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
}
void CStockGraph::DrawTechBOLL( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.boll.AttachParameters( AfxGetProfile().GetTechParameters().boll );
DrawTechUtil3( pDC, rect, bDrawTitle, dMin, dMax, STT_BOLL, &(m_techparam.boll), &kdata,
AfxGetProfile().GetColor(CColorClass::clrPlane),
AfxGetProfile().GetColor(CColorClass::clrRise),
AfxGetProfile().GetColor(CColorClass::clrFall),
"MB", "UP", "DOWN");
}
void CStockGraph::DrawTechPV( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.pv.AttachParameters( AfxGetProfile().GetTechParameters().pv );
DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_PV, &(m_techparam.pv), &kdata,
AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_line );
}
void CStockGraph::DrawTechSAR( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.sar.AttachParameters( AfxGetProfile().GetTechParameters().sar );
DrawTechUtil1( pDC, rect, bDrawTitle, dMin, dMax, STT_SAR, &(m_techparam.sar), &kdata,
AfxGetProfile().GetColor(CColorClass::clrLine1), drawtechtype_dot );
}
void CStockGraph::DrawTechDJ( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
CHECK_NODATATODRAW
DECLARE_COLOR_DEFINATION
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.dj.AttachParameters( AfxGetProfile().GetTechParameters().dj );
// Draw Sub Title
if( bDrawTitle )
{
CString strTitle = AfxGetSTTShortName(STT_DJ);
strTitle += " ";
if( m_CurStock.GetStockInfo().IsShangHai() )
strTitle += m_techparam.dj.m_strCodeSha;
else if( m_CurStock.GetStockInfo().IsShenZhen() )
strTitle += m_techparam.dj.m_strCodeSzn;
DrawTechTitle( pDC, rect.left+5, rect.top+1, strTitle, TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
return;
}
// Prepare Data
if( !m_techparam.dj.IsValidParameters() )
m_techparam.dj.SetDefaultParameters( );
if( !m_techparam.dj.PrepareStockData( &AfxGetDB(), m_CurStock.GetStockCode(),
m_nCurKType, m_nCurKFormat, m_nCurMaindataType,
AfxGetProfile().GetAutoResumeDRBegin(), AfxGetProfile().GetAutoResumeDRLimit() ) )
return;
CKData * pKData = NULL;
if( m_CurStock.GetStockInfo().IsShangHai() )
pKData = & ( CDJ::m_stockSha.GetKData(m_nCurKType) );
else if( m_CurStock.GetStockInfo().IsShenZhen() )
pKData = & ( CDJ::m_stockSzn.GetKData(m_nCurKType) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -