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

📄 drawtech.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				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 + -