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

📄 line.cpp

📁 EVC 编的示波器程序
💻 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 + -