📄 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;
nWidth = 30;
xcoorfator=xCoorDeta/xDeta;
ycoorfator=yCoorDeta/yDeta;
timePerUnit=0;
IndextoPixsCoef=0;
for(int i=0;i<3;i++)
{
YValuePerUnit[i]=WINDOWYLENGTHORIGIN/YAXISDASHNUM;
YValuetoPixsCoef[i]=0;
m_dYOffset[i]=0;
m_bChanelOpen[i]=TRUE;
}
TitleMode=CBaseGr::LEFT;
LegendMode=CBaseGr::BOTTOM;
m_pbitmapOldCoordinate=NULL;
m_pbitmapOldContent=NULL;
m_pbitmapOldLegend=NULL;
m_pbitmapOldTmp=NULL;
m_pmemOldBitmap=NULL;
m_bCoordinataFlag=TRUE;
}
CLine::~CLine()
{
}
void CLine::AddLineData(CLineData*& pLineData)
{
LineDataList.AddTail(pLineData);
}
void CLine::DrawCurveLine(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
xPixsPerUnit=(RightBottomx-RIGHTLEFTWIDTH-LeftTopx-LEFTLEFTWIDTH)/TIMEDASHNUM;
yPixsPerUnit=(RightBottomy-BOTTOMLEFTWIDTH-LeftTopy-TOPLEFTWIDTH)/YAXISDASHNUM;
yzeroPixPos=((LeftTopy+TOPLEFTWIDTH)+(RightBottomy-BOTTOMLEFTWIDTH))/2;
if(m_bCoordinataFlag)
{
m_bCoordinataFlag=FALSE;
if (m_dcCoordinate.GetSafeHdc() == NULL)
{
m_dcCoordinate.CreateCompatibleDC(pDC) ;
m_bitmapCoordinate.CreateCompatibleBitmap(pDC, RightBottomx, RightBottomy) ;
}
m_pbitmapOldCoordinate = m_dcCoordinate.SelectObject(&m_bitmapCoordinate) ;
// m_dcCoordinate.SetBkColor(RGB(255,0,0));
m_dcCoordinate.FillSolidRect(0,0,RightBottomx,RightBottomy,RGB(255,255,255));
DrawCoordinate(&m_dcCoordinate,LeftTopx+LEFTLEFTWIDTH,LeftTopy+TOPLEFTWIDTH,RightBottomx-RIGHTLEFTWIDTH,RightBottomy-BOTTOMLEFTWIDTH,WithDash);
DrawLegend(&m_dcCoordinate,RightBottomx-RIGHTLEFTWIDTH+2,LeftTopy+LEFTLEFTWIDTH,RIGHTLEFTWIDTH-4,LegendMode);
}
if (m_dcContent.GetSafeHdc() == NULL)
{
m_dcContent.CreateCompatibleDC(pDC) ;
m_bitmapContent.CreateCompatibleBitmap(pDC, RightBottomx, RightBottomy) ;
}
// 注意:载入bitmap要放在if之外,否则只载入起始的bitmap,后面对bitmap修改无响应
m_pbitmapOldContent = m_dcContent.SelectObject(&m_bitmapContent) ;
// m_dcContent.SetBkColor(RGB(255,0,0));
// CBrush m_crbkBush;
// m_crbkBush.CreateSolidBrush(RGB(255,255,255));
m_dcContent.FillSolidRect(0,0,RightBottomx,RightBottomy,RGB(255,255,255));
DrawContent(&m_dcContent,LeftTopx+LEFTLEFTWIDTH,LeftTopy+TOPLEFTWIDTH,RightBottomx-RIGHTLEFTWIDTH,RightBottomy-BOTTOMLEFTWIDTH);
if (m_dcTmp.GetSafeHdc() == NULL)
{
m_dcTmp.CreateCompatibleDC(pDC) ;
m_bitmapTmp.CreateCompatibleBitmap(pDC,RightBottomx, RightBottomy) ;
}
m_pbitmapOldTmp = (CBitmap *)m_dcTmp.SelectObject(&m_bitmapTmp) ;
if (m_memDC.GetSafeHdc() == NULL)
{
m_memDC.CreateCompatibleDC(pDC) ;
m_memBitmap.CreateCompatibleBitmap(pDC,RightBottomx, RightBottomy) ;
}
m_pmemOldBitmap = (CBitmap *)m_memDC.SelectObject(&m_memBitmap) ;
if (m_memDC.GetSafeHdc() != NULL)
{
m_dcTmp.BitBlt(0, 0, RightBottomx, RightBottomy,
&m_dcCoordinate, 0, 0, SRCCOPY) ;
m_memDC.BitBlt(0, 0, RightBottomx, RightBottomy,
&m_dcTmp, 0, 0, SRCCOPY) ;
m_memDC.BitBlt(0, 0, RightBottomx, RightBottomy,
&m_dcContent, 0, 0, SRCAND) ; //SRCAND
// finally send the result to the display
pDC->BitBlt(0, 0,RightBottomx, RightBottomy,
&m_memDC, 0, 0, SRCCOPY) ;
}
m_dcCoordinate.SelectObject(m_pbitmapOldCoordinate) ;
m_dcContent.SelectObject(m_pbitmapOldContent) ;
m_dcTmp.SelectObject(m_pbitmapOldTmp) ;
m_memDC.SelectObject(m_pmemOldBitmap) ;
}
//画坐标系
void CLine::DrawCoordinate(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy,BOOL WithDash)
{
//画示波区外框
DrawLine(pDC,LeftTopx,LeftTopy,LeftTopx,RightBottomy);
DrawLine(pDC,LeftTopx,RightBottomy,RightBottomx,RightBottomy);
DrawLine(pDC,RightBottomx,RightBottomy,RightBottomx,LeftTopy);
DrawLine(pDC,RightBottomx,LeftTopy,LeftTopx,LeftTopy);
/* //调整Y轴刻度像素尺度,使大于10 pixs
int nDeta = 1; //坐标系自动调整数值尺度 5
int nCount = (YMax - YMin)/nDeta;
int nCoorDeta = (RightBottomy - LeftTopy)/nCount;
while(nCoorDeta < 10 )
{
nDeta += nDeta;
nCount = (YMax - YMin)/nDeta ;
nCoorDeta = (RightBottomy - LeftTopy)/nCount;
}
yDeta = nDeta; //y轴数值尺度
yCoorDeta = nCoorDeta; //y轴像素尺度
ycoorfator=yCoorDeta/yDeta; //y轴转换尺度
// if(WithDash)
// {
// DrawLine(pDC,RightBottomx,RightBottomy,RightBottomx,LeftTopy);
// DrawLine(pDC,RightBottomx,LeftTopy,LeftTopx,LeftTopy);
// }
//y轴原点
CString CoordinateValue;
CoordinateValue.Format(_T("%3d"),YMin);
DrawYCoordinateValue(pDC,LeftTopx-65,RightBottomy-5,CoordinateValue);
//画Y轴刻度
for(int i=1;i<=nCount;i++)
{
if(WithDash) //若TRUE 画Y轴网格线
DrawDashLine(pDC,LeftTopx,RightBottomy-yCoorDeta*i,RightBottomx,RightBottomy-yCoorDeta*i);
DrawLine(pDC,LeftTopx-5,RightBottomy-yCoorDeta*i,LeftTopx,RightBottomy-yCoorDeta*i);
CoordinateValue.Format(_T("%3d"),YMin+yDeta*i);
DrawYCoordinateValue(pDC,LeftTopx-70,RightBottomy-yCoorDeta*i-5,CoordinateValue);
}
*/
for(int i=0;i<=YAXISDASHNUM;i++)
{
if(WithDash) //若TRUE 画Y轴网格线
DrawDashLine(pDC,LeftTopx,yzeroPixPos-yPixsPerUnit*(5-i),RightBottomx,yzeroPixPos-yPixsPerUnit*(5-i));
DrawLine(pDC,LeftTopx-5,yzeroPixPos-yPixsPerUnit*(5-i),LeftTopx,yzeroPixPos-yPixsPerUnit*(5-i));
}
CString CoordinateValue;
CoordinateValue.Format(_T("%3d"),0);
DrawYCoordinateValue(pDC,LeftTopx-5,yzeroPixPos-5,CoordinateValue);
/* //调整X轴刻度像素尺度,使大于20 pixs
nDeta = 5;
nCount = (XMax - XMin)/nDeta;
nCoorDeta = (RightBottomx-LeftTopx)/nCount;
while(nCoorDeta < 20)
{
nDeta +=nDeta;
nCount = (XMax - XMin)/nDeta;
nCoorDeta = (RightBottomx-LeftTopx)/nCount;
}
xDeta = nDeta; //x轴数值尺度
xCoorDeta = nCoorDeta; //x轴像素尺度
xcoorfator=xCoorDeta/xDeta; //x轴转换尺度
//画x轴原点
CoordinateValue.Format(_T("%d"),XMin);
DrawXCoordinateValue(pDC,LeftTopx-7,RightBottomy+2,CoordinateValue,CBaseGr::VER,RGB(0,0,255));
//画x轴刻度
for(int j=1;j<=nCount;j++)
{
if(WithDash) //若TRUE 画x轴网格线
DrawDashLine(pDC,LeftTopx+xCoorDeta*j,RightBottomy,LeftTopx+xCoorDeta*j,LeftTopy);
DrawLine(pDC,LeftTopx+xCoorDeta*j,RightBottomy,LeftTopx+xCoorDeta*j,RightBottomy-5);
CoordinateValue.Format(_T("%d"),XMin+xDeta*j);
DrawXCoordinateValue(pDC,LeftTopx-7+xCoorDeta*j,RightBottomy+2,CoordinateValue,CBaseGr::VER,RGB(0,0,255));
}
*/
for(int j=0;j<=TIMEDASHNUM;j++)
{
if(WithDash) //若TRUE 画x轴网格线
DrawDashLine(pDC,LeftTopx+xPixsPerUnit*j,RightBottomy,LeftTopx+xPixsPerUnit*j,LeftTopy);
DrawLine(pDC,LeftTopx+xPixsPerUnit*j,RightBottomy+5,LeftTopx+xPixsPerUnit*j,RightBottomy);
}
//画标题和坐标系名称
// 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);
}
//画图例
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);
pDC->ExtTextOut(Startx+2,Starty+15*i*2+15+1,ETO_OPAQUE,NULL,LineDataList.GetAt(pos)->LegendName,NULL);
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);
}
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++)//LineDataList.GetCount() 曲线数
{
if(m_bChanelOpen[i])
{
IndextoPixsCoef =xPixsPerUnit*SAMPLEPERIOD/timePerUnit;
YValuetoPixsCoef[i] =yPixsPerUnit/YValuePerUnit[i];
double x1,y1,x2,y2;
pos = LineDataList.FindIndex(i);
int LineLength=LineDataList.GetAt(pos)->structDataArray.GetSize();
int LineSize=LineDataList.GetAt(pos)->LineSize;
int LineColor=LineDataList.GetAt(pos)->LineColor;
int PointColor=LineDataList.GetAt(pos)->PointColor;
//如果第i条曲线上有点存在,获取起点
if(LineLength)
{
// x1 = LineDataList.GetAt(pos)->structDataArray[0].XData;//起点
x1 = 0;
y1 = LineDataList.GetAt(pos)->structDataArray[0].YData;
}
//画第i条曲线
for(int j=1;j<LineLength;j++)
{
// x2 = LineDataList.GetAt(pos)->structDataArray[j].XData;
x2 = j;
y2 = LineDataList.GetAt(pos)->structDataArray[j].YData;
POINT p1,p2;
p1.x = LeftTopx+(int)(x1*IndextoPixsCoef+0.5);//+0.5 四舍五入
p1.y = yzeroPixPos-(int)((y1-m_dYOffset[i])*YValuetoPixsCoef[i]);
p2.x = LeftTopx+(int)(x2*IndextoPixsCoef+0.5);
p2.y = yzeroPixPos-(int)((y2-m_dYOffset[i])*YValuetoPixsCoef[i]);
x1 = x2;
y1 = y2;
//////******************************************************************
// 可改进减小时间开销,DrawLine中把选画笔拿出来放到循环之外&取消画点
//画两点间的线
DrawLine(pDC,p1,p2,LineSize,LineColor);
//画数据点
if(WithDot)
{
if(j==1)
DrawPoint(pDC,p1.x,p1.y,LineDataList.GetAt(pos)->ePointType,DotSize,LineSize,LineColor,PointColor);
DrawPoint(pDC,p2.x,p2.y,LineDataList.GetAt(pos)->ePointType,DotSize,LineSize,LineColor,PointColor);
}
}
}
}
}
double CLine::SetTimeRef(int m_nsettime)
{
return timePerUnit = pow(2,m_nsettime)*WINDOWTIMELENGTHORIGIN/TIMEDASHNUM/32.0; //返回时间轴刻度,WINDOWTIMEORIGIN为起始的窗口时间
}
double CLine::SetYValueRef(int iIndex,int m_nsetYValue)
{
return YValuePerUnit[iIndex]= pow(2,m_nsetYValue)*WINDOWYLENGTHORIGIN/YAXISDASHNUM/1024; //返回y轴刻度
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -