📄 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;i<m_Legend.GetSize();i++)
// {
// if(nWidth < m_Legend[i].Name.GetLength())
// nWidth = m_Legend[i].Name.GetLength();
// }
CFont m_font;
// m_font.CreateFont(
// 12, // nHeight
// 0, // nWidth
// 0, // nEscapement
// 0, // nOrientation
// FW_NORMAL, // nWeight
// FALSE, // bItalic
// FALSE, // bUnderline
// FALSE, // cStrikeOut
// OEM_CHARSET, // nCharSet
// OUT_DEFAULT_PRECIS, // nOutPrecision
// CLIP_DEFAULT_PRECIS, // nClipPrecision
// DEFAULT_QUALITY, // nQuality
// DEFAULT_PITCH | FF_DONTCARE, // nPitchAndFamily
// _T("宋体"));
m_font.CreatePointFont(100,_T("宋体"));
CFont *pOldFont = pDC->SelectObject(&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;i<LineDataList.GetCount();i++)
{
pos = LineDataList.FindIndex(i);
pDC->ExtTextOut(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;i<LineDataList.GetCount();i++)
{
pos = LineDataList.FindIndex(i);
if(WithDot)
DrawPoint(pDC,
Startx+7,Starty+15*i*2+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+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;i<LineDataList.GetCount();i++)
{
double x1,y1,x2,y2;
pos = LineDataList.FindIndex(i);
if(LineDataList.GetAt(pos)->structDataArray.GetSize())
{
x1 = LineDataList.GetAt(pos)->structDataArray[0].XData;
y1 = LineDataList.GetAt(pos)->structDataArray[0].YData;
}
for(int j=1;j<LineDataList.GetAt(pos)->structDataArray.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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -