www.pudn.com > DrawGrInDlg.rar > Line.cpp


// Line.cpp: implementation of the CLine class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Line.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CLine::CLine() 
{ 
	WithDash=FALSE; 
	WithDot = TRUE; 
	DotSize = 3; 
	xCoorDeta=0; 
	xDeta = 5; 
	yCoorDeta=0; 
	yDeta = 5; 
	TitleMode=CBaseGr::TOP; 
	LegendMode=CBaseGr::BOTTOM; 
} 
 
CLine::~CLine() 
{ 
 
} 
void CLine::AddLineData(CLineData*& pLineData) 
{ 
	LineDataList.AddTail(pLineData); 
} 
void CLine::DrawCurveLine(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy) 
{ 
	int nWidth = 30; 
	DrawCoordinate(pDC,LeftTopx+40,LeftTopy+37,RightBottomx-4-nWidth,RightBottomy-54,WithDash); 
	DrawContent(pDC,LeftTopx+40,LeftTopy+37,RightBottomx-4-nWidth,RightBottomy-54); 
	DrawLegend(pDC,RightBottomx-2-nWidth,LeftTopy+37,nWidth,LegendMode); 
} 
void CLine::DrawLegend(CDC* pDC,int Startx,int Starty,int Width,Align Mode,COLORREF FontColor) 
{ 
	int i=0; 
//	int nWidth=0; 
//	if(m_Legend.GetSize()>0) 
//		nWidth = m_Legend[0].Name.GetLength(); 
//	for(i=1;iSelectObject(&m_font); 
	pDC->SetTextColor(FontColor); 
	POSITION pos; 
	switch(Mode) 
	{ 
	case TOP: 
		DrawRectangle(pDC,Startx,Starty,Startx+Width,Starty+15*LineDataList.GetCount()*2); 
		for(i=0;iExtTextOut(Startx+2,Starty+15*i*2+1,ETO_OPAQUE,NULL,LineDataList.GetAt(pos)->LegendName,NULL); 
			if(WithDot) 
			DrawPoint(pDC, 
				Startx+7,Starty+15*i*2+15+7, 
				LineDataList.GetAt(pos)->ePointType, 
				5, 
				LineDataList.GetAt(pos)->LineSize, 
				LineDataList.GetAt(pos)->LineColor, 
				LineDataList.GetAt(pos)->PointColor); 
			else 
			DrawRectangle(pDC, 
			Startx+2,Starty+15*i*2+15+2,Startx+Width-2,Starty+15*(i+1)*2-2, 
			LineDataList.GetAt(pos)->LineSize, 
			LineDataList.GetAt(pos)->LineColor, 
			LineDataList.GetAt(pos)->PointColor); 
		} 
		break; 
	case BOTTOM: 
		DrawRectangle(pDC,Startx,Starty,Startx+Width,Starty+15*LineDataList.GetCount()*2); 
		for(i=0;iePointType, 
				5, 
				LineDataList.GetAt(pos)->LineSize, 
				LineDataList.GetAt(pos)->LineColor, 
				LineDataList.GetAt(pos)->PointColor); 
			else 
			DrawRectangle(pDC, 
			Startx+2,Starty+15*i*2+2,Startx+Width-2,Starty+15*i*2+15-2, 
			LineDataList.GetAt(pos)->LineSize, 
			LineDataList.GetAt(pos)->LineColor, 
			LineDataList.GetAt(pos)->PointColor); 
			pDC->ExtTextOut(Startx+2,Starty+15*i*2+15+1,ETO_OPAQUE,NULL,LineDataList.GetAt(pos)->LegendName,NULL); 
		} 
		break; 
	case LEFT: 
		break; 
	case RIGHT: 
		break; 
	case ON: 
		break; 
	case NONE: 
		break; 
	} 
	pDC->SelectObject(pOldFont); 
} 
void CLine::DrawContent(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy) 
{ 
//	int Height = ((int)(m_Legend.GetAt(i-1).Value+0.5)-YMin)*yCoorDeta/yDeta; 
	POSITION pos; 
	for(int i=0;istructDataArray.GetSize()) 
		{ 
			x1 = LineDataList.GetAt(pos)->structDataArray[0].XData; 
			y1 = LineDataList.GetAt(pos)->structDataArray[0].YData; 
		} 
		for(int j=1;jstructDataArray.GetSize();j++) 
		{ 
			x2 = LineDataList.GetAt(pos)->structDataArray[j].XData; 
			y2 = LineDataList.GetAt(pos)->structDataArray[j].YData; 
			POINT p1,p2; 
			p1.x = LeftTopx+(int)((x1-XMin)*xCoorDeta/xDeta+0.5); 
			p1.y = RightBottomy-(int)((y1-YMin)*yCoorDeta/yDeta+0.5); 
			p2.x = LeftTopx+(int)((x2-XMin)*xCoorDeta/xDeta+0.5); 
			p2.y = RightBottomy-(int)((y2-YMin)*yCoorDeta/yDeta+0.5); 
			x1 = x2; 
			y1 = y2; 
			 
			DrawLine(pDC,p1,p2,LineDataList.GetAt(pos)->LineSize,LineDataList.GetAt(pos)->LineColor); 
			if(WithDot) 
			{ 
			if(j==1) 
				DrawPoint(pDC,p1.x,p1.y, 
					LineDataList.GetAt(pos)->ePointType, 
					DotSize, 
					LineDataList.GetAt(pos)->LineSize, 
					LineDataList.GetAt(pos)->LineColor, 
					LineDataList.GetAt(pos)->PointColor); 
			DrawPoint(pDC,p2.x,p2.y, 
				LineDataList.GetAt(pos)->ePointType, 
				DotSize, 
				LineDataList.GetAt(pos)->LineSize, 
				LineDataList.GetAt(pos)->LineColor, 
				LineDataList.GetAt(pos)->PointColor); 
			} 
		} 
	} 
} 
void CLine::DrawCoordinate(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy,BOOL WithDash) 
{ 
	int nDeta = 5; 
	int nCount = (YMax - YMin)/nDeta ; 
	int nCoorDeta = (RightBottomy - LeftTopy)/nCount; 
	yCoorDeta = nCoorDeta; 
	while(nCoorDeta < 10 ) 
	{ 
		nDeta += 5; 
		yDeta = nDeta; 
		nCount = (YMax - YMin)/nDeta ; 
		nCoorDeta = (RightBottomy - LeftTopy)/nCount; 
		yCoorDeta = nCoorDeta; 
	} 
	DrawLine(pDC,LeftTopx,LeftTopy,LeftTopx,RightBottomy); 
	DrawLine(pDC,LeftTopx,RightBottomy,RightBottomx,RightBottomy); 
	if(WithDash) 
	{ 
		DrawLine(pDC,RightBottomx,RightBottomy,RightBottomx,LeftTopy); 
		DrawLine(pDC,RightBottomx,LeftTopy,LeftTopx,LeftTopy); 
	} 
	CString CoordinateValue; 
	CoordinateValue.Format(_T("%3d"),YMin); 
	DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-5,CoordinateValue); 
	for(int i=1;i<=nCount;i++) 
	{ 
		if(WithDash) 
			DrawDashLine(pDC,LeftTopx,RightBottomy-nCoorDeta*i,RightBottomx,RightBottomy-nCoorDeta*i); 
		DrawLine(pDC,LeftTopx,RightBottomy-nCoorDeta*i,LeftTopx+5,RightBottomy-nCoorDeta*i); 
		CoordinateValue.Format(_T("%3d"),YMin+nDeta*i); 
		DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-nCoorDeta*i-5,CoordinateValue); 
	} 
 
	nDeta = 5; 
	nCount = (XMax - XMin)/nDeta; 
	nCoorDeta = (RightBottomx-LeftTopx)/nCount; 
	xCoorDeta = nCoorDeta; 
	while(nCoorDeta < 10) 
	{ 
		nDeta +=5; 
		xDeta = nDeta; 
		nCount = (XMax - XMin)/nDeta; 
		nCoorDeta = (RightBottomx-LeftTopx)/nCount; 
		xCoorDeta = nCoorDeta; 
	} 
 
	CoordinateValue.Format(_T("%d"),XMin); 
	DrawXCoordinateValue(pDC,LeftTopx-7,RightBottomy+2,CoordinateValue,CBaseGr::VER,RGB(0,0,255)); 
	for(int j=1;j<=nCount;j++) 
	{ 
		if(WithDash) 
			DrawDashLine(pDC,LeftTopx+nCoorDeta*j,RightBottomy,LeftTopx+nCoorDeta*j,LeftTopy); 
		DrawLine(pDC,LeftTopx+nCoorDeta*j,RightBottomy,LeftTopx+nCoorDeta*j,RightBottomy-5); 
		CoordinateValue.Format(_T("%d"),XMin+nDeta*j); 
		DrawXCoordinateValue(pDC,LeftTopx-7+nCoorDeta*j,RightBottomy+2,CoordinateValue,CBaseGr::VER,RGB(0,0,255)); 
	} 
 
	DrawXName(pDC,RightBottomx-12*XName.GetLength(),RightBottomy+15,XName); 
	DrawYName(pDC,LeftTopx-35,LeftTopy+12*YName.GetLength(),YName); 
	DrawTitle(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,TitleMode); 
}