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

📄 drawdlgover.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	//绘制实时曲线
	long x_temp;
	long y_temp;
	long i;
	y_temp=(long) (m_PlotRect.bottom-(dataShow_Y[0]-m_min_Y)*scale_Y);
	x_temp=(long) (m_PlotRect.left+(dataShow_X[0]-m_min_X)*scale_X);
	//y_temp=m_PlotRect.bottom;
	//x_temp=m_PlotRect.left;
	pDC->MoveTo(x_temp,y_temp);
	for(i=1;i<m_Y_Long;i++)
	{
		y_temp=(long) (m_PlotRect.bottom-(dataShow_Y[i]-m_min_Y)*scale_Y);
		x_temp=(long) (m_PlotRect.left+(dataShow_X[i]-m_min_X)*scale_X);
		pDC->LineTo(x_temp,y_temp);
	}
	pDC->SelectObject(oldpen);
	//MessageBox("1");
 }
 else
	 MessageBox("没有获取到实时数据!");
	
}

//画标题区域
void DrawDlgOver::DrawTitle(CDC *pDC)
{
	pDC->FillRect(m_TitleRect,&CBrush(m_LabelColor));
	//pDC->FillRect(m_TitleRect,&CBrush(RGB(212,208,200)));
	
	CFont *OldFont;
	OldFont=pDC->SelectObject(&Title_Font);
	pDC->SetBkMode(TRANSPARENT);//设置为透明
	pDC->SetTextAlign(TA_CENTER);//设置为字体居中
	int a_t=(m_TitleRect.left+m_TitleRect.right)/2;
	int b_t=m_TitleRect.bottom-m_TitleRect.Height()/2-5;
	//MessageBox("1");
	pDC->TextOut(a_t,b_t,Title);
	pDC->SelectObject(OldFont);

}

//显示X坐标轴名称和单位
void DrawDlgOver::DrawTitleX(CDC *pDC)
{
	pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));	
	//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(212,208,200)));
	//设置字体
	CFont *pOldfond=NULL;
	pDC->SetTextAlign(TA_CENTER);//中间靠齐
	pDC->SetBkMode(TRANSPARENT);
	pDC->SelectObject(&Title_Font_X);

	CString str;
	CPoint pp;

	//画坐标轴名称
	pp.x=m_PlotRect.left+m_PlotRect.Width()/2-5;
	pp.y=m_LabelRect_X.bottom-m_LabelRect_X.Height()/2-2;
	str.Format("%s",Uint_X);
	pDC->TextOut(pp.x,pp.y,str);
	pDC->SelectObject(pOldfond);
}

//显示Y坐标轴名称和单位
void DrawDlgOver::DrawTitleY(CDC *pDC)
{
	pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
	//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(212,208,200)));
	
	//设置字体
	CFont *pOldfond=NULL;
	pDC->SetTextAlign(TA_LEFT);//左靠齐
	pDC->SetBkMode(TRANSPARENT);
	pOldfond=pDC->SelectObject(&Title_Font_Y);//选用横向显示字体
	CString str ;
	CPoint pp;
	
	//画坐标轴名称	
	pDC->SetTextAlign(TA_CENTER);
	pp.x=m_LabelRect_Y.left+5;
	pp.y=m_PlotRect.bottom-m_PlotRect.Height()/2;
	//显示	
	str.Format("%s",Uint_Y);
	pDC->TextOut(pp.x,pp.y,str);
	pDC->SelectObject(pOldfond);
}

//画x轴的示数
void DrawDlgOver::DrawLabelX(CDC *pDC, double Xmax_time, double Xmin_time)
{
	pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));
	//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(212,208,200)));
	//设置字体
	CFont *pOldfond=NULL;
	pDC->SetTextAlign(TA_CENTER);//中间靠齐
	pDC->SetBkMode(TRANSPARENT);
	pOldfond=pDC->SelectObject(&Label_Font_X);
	CString str ;
	CPoint pp;
	double XStep=(Xmax_time-Xmin_time)/(m_GridX+1);	
	for (int i=0;i<m_GridX+2;i++)
	{		
		pp.x=m_PlotRect.left+i*m_PlotRect.Width()/(m_GridX+1);
		pp.y=m_LabelRect_X.top;		
		str.Format("%5.2f",i*XStep);
		pDC->TextOut(pp.x,pp.y,str);
	}
	//显示坐标轴名称和单位	
	pDC->SelectObject(&Title_Font_X);
	pp.x=m_PlotRect.left+m_PlotRect.Width()/2-5;
	pp.y=m_LabelRect_X.bottom-m_LabelRect_X.Height()/2-2;
	str.Format("%s",Uint_X);
	pDC->TextOut(pp.x,pp.y,str);
	pDC->SelectObject(pOldfond);
}

//画Y轴的示数
void DrawDlgOver::DrawLabelY(CDC *pDC, double Ymax_time, double Ymin_time)
{
	pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
	//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(212,208,200)));

	//设置字体
	CFont *pOldfond=NULL;
	pDC->SetTextAlign(TA_LEFT);//左靠齐
	pDC->SetBkMode(TRANSPARENT);
	pOldfond=pDC->SelectObject(&Label_Font_X);//选用横向显示字体
	CString str ;
	CPoint pp;
	double YStep=(Ymax_time-Ymin_time)/(m_GridY+1);		
	for (int i=0;i<m_GridY+2;i++)
	{		
		pp.y=m_PlotRect.bottom-i*m_PlotRect.Height()/(m_GridY+1)-6;
		pp.x=m_LabelRect_Y.left+m_LabelRect_Y.Width()/2-2;	
		str.Format("%5.2f",Ymin_time+i*YStep);	
		pDC->TextOut(pp.x,pp.y,str);
	}

	//画坐标轴名称
	pDC->SelectObject(Label_Font_Y);
	pDC->SetTextAlign(TA_CENTER);
	pp.x=m_LabelRect_Y.left+5;
	pp.y=m_PlotRect.bottom-m_PlotRect.Height()/2;
	//显示	
	str.Format("%s",Uint_Y);
	pDC->TextOut(pp.x,pp.y,str);	
	pDC->SelectObject(pOldfond);
}

//画显示信息
void DrawDlgOver::DrawMessage(CDC *pDC)
{
	pDC->FillRect(m_TextOutRect,&CBrush(m_LabelColor));	
	//pDC->FillRect(m_TextOutRect,&CBrush(RGB(212,208,200)));	
	CString str1,str2,str3,str4;

	CFont *OldFont;
	OldFont=pDC->SelectObject(&Title_Font);
	pDC->SetBkMode(TRANSPARENT);//设置为透明
	pDC->SetTextAlign(TA_CENTER);//设置为字体居中
	//得到信息窗口的高度和宽度
	long xwidth=m_TextOutRect.Width();
	long yheigh=m_TextOutRect.Height();
	//设定坐标
	int a_t=m_TextOutRect.left+xwidth/2-10;	
	int b_t=m_TextOutRect.bottom/8;
	pDC->TextOut(a_t,b_t,"图形信息");

	pDC->SetTextAlign(TA_LEFT);

	str3.Format("%s",Uint_X);
	//str4.Format("%s",Uint_Y);
	str4= "峰值";

	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+65,"统计信息");
	pDC->SelectObject(&Label_Font_X);
	str1.Format("平均值:%5.2f",m_Average);
	str2.Format("均方值:%5.2f",m_ds);
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+81,str1);	
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+91,str2);
	/*峰值信息*/
	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+115,"峰值信息");	
	pDC->SelectObject(&Label_Font_X);

	pDC->TextOut(m_TextOutRect.left+4,m_TextOutRect.top+132,"序号");
	pDC->TextOut(m_TextOutRect.left+27,m_TextOutRect.top+132,str4);
	pDC->TextOut(m_TextOutRect.left+52,m_TextOutRect.top+132,str3);
	double peak;
	long pos;
	if (m_bDataReady)//数据准备好
	{
		GetPeakData();//得到峰值信息
		for(int i=0;i<m_Peak_Num;i++)
		{
			peak=data_Peak[i];
			pos=data_Peak_pos[i];

			str1.Format("%d ",i+1);
			str2.Format("%5.2f",peak);		
			str3.Format("%d",pos);
		
			pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+145+i*15,str1);		
			pDC->TextOut(m_TextOutRect.left+25,m_TextOutRect.top+145+i*15,str2);		
			pDC->TextOut(m_TextOutRect.left+57,m_TextOutRect.top+145+i*15,str3);
		}
	}
	
	pDC->SelectObject(OldFont);

}

//得到峰值信息
void DrawDlgOver::GetPeakData()
{
	double *temp=new double [m_Y_Long];
	long *temp_pos=new long [m_Y_Long];

	//调用求峰值函数
	m_Peak_Num=calculate_over.FindPeak(dataShow_Y,temp,temp_pos,m_Y_Long);

	//从大到小排序
	calculate_over.Bub(temp,temp_pos,m_Peak_Num);
	int peakn;
	if(m_Y_Long>10)
		peakn=10;
	else
		peakn=m_Y_Long;
	//取前10个
	for(int i=0;i<peakn;i++)
	{
		if(m_Peak_Num>10)
		{
			data_Peak[i]=temp[i];
			data_Peak_pos[i]=temp_pos[i];
		}
		else
		{
			if(i<m_Peak_Num)
			{
				data_Peak[i]=temp[i];
				data_Peak_pos[i]=temp_pos[i];
			}
			else
			{
				data_Peak[i]=0;
				data_Peak_pos[i]=0;
			}
		}

	}
	//MessageBox("12");
	delete [] temp_pos;
	delete [] temp;
}

//获取采集窗口的数据
void DrawDlgOver::GetData(double *y,double *x,long x_Long,long y_Long)
{
	//销毁以前的数据	
	if(dataShow_Y)  {   delete [] dataShow_Y; dataShow_Y=NULL;}
	if(dataShow_X)  {	delete [] dataShow_X;dataShow_X=NULL;}
	//传递大小
	m_X_Long=x_Long;
	m_Y_Long=y_Long;
	//动态创建2个数组	
	dataShow_Y=new double [m_Y_Long];	
	dataShow_X=new double [m_X_Long];
	int i;
	//传递x向数据
	for(i=0;i<m_X_Long;i++)
	{	
		dataShow_X[i]=x[i];
	}
	//传递y向数据
	for(i=0;i<m_Y_Long;i++)
	{
		dataShow_Y[i]=y[i];
	}
	//数据准备好
	m_bDataReady=TRUE;
	//Invalidate(false);
}

//效率仪读取数据达到设定值的消息响应函数
void DrawDlgOver::OnPowerDaqFinish(WPARAM wParam, LPARAM lParam)
{	
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();	
	
	if (m_bStartOn)
	{
		//绘制实时曲线
		m_nDrawType =3;

		long number,totalnumber;
		int ntimes;//一共有多少组
		
		number = pApp->pCTestFormDoc->nPowerNumber; //每组数据个数
		totalnumber = pApp->pCTestFormDoc->nTotalPowerNumber;//数据总数
		ntimes = (int)(totalnumber/number);

		//定义各个数据数组
		double *PowerData=new double [number];		
		double *PowerInRate=new double [number];
		//double *PowerOutRate=new double [number];
		double *PowerInTorque=new double [number];
		//double *PowerOutTorque=new double [number];	
		
		double *ptime=new double [number];//存放时间坐标
		long *pPosition=new long [number];//存放位置

		PowerData = pApp->pCTestFormDoc->pPowerData;
		PowerInRate = pApp->pCTestFormDoc->pPowerInRate;
		//PowerOutRate = pApp->pCTestFormDoc->pPowerOutRate;
		PowerInTorque = pApp->pCTestFormDoc->pPowerInTorque;
		//PowerOutTorque = pApp->pCTestFormDoc->pPowerOutTorque;
		
		/*定义需要显示数组的最大最小值和统计信息*/
		//定义最大值
		double max_PowerData;
		double max_PowerInRate;
		double max_PowerInTorque;
		//定义最小值
		double min_PowerData;
		double min_PowerInRate;
		double min_PowerInTorque;		
		
		/*获取最大,最小值和统计信息*/
		//效率
		max_PowerData=calculate_over.FindMax(PowerData,number);
		min_PowerData=calculate_over.FindMin(PowerData,number);
		
		//输入转速
		max_PowerInRate=calculate_over.FindMax(PowerData,number);
		min_PowerInRate=calculate_over.FindMin(PowerData,number);
		//输入扭矩
		max_PowerInTorque=calculate_over.FindMax(PowerData,number);
		min_PowerInTorque=calculate_over.FindMin(PowerData,number);
		

		//获取时间坐标刻度
		for (int i=0;i<number;i++)
		{
			ptime[i]=(totalnumber-number)+i;
			pPosition[i]=(long)i;
		}		
	
		switch(m_nHitnember) 
		{
		 case 1:
			//MessageBox("1");
			m_dMax_Y =max_PowerData;
			m_dMin_Y =min_PowerData;
			m_dMax_X =ptime[number-1];
			m_dMin_X =ptime[0];
			GetData(PowerData,ptime,number,number);
			//获取统计信息
			m_Average=calculate_over.GetAverage(PowerData,number);
			m_ds=calculate_over.GetRoot(PowerData,number);
			break;
		 case 2:
			m_dMax_Y =max_PowerInRate;
			m_dMin_Y =min_PowerInRate;
			m_dMax_X =ptime[number-1];
			m_dMin_X =ptime[0];
			GetData(PowerInRate,ptime,number,number);
			//获取统计信息
			m_Average=calculate_over.GetAverage(PowerInRate,number);
			m_ds=calculate_over.GetRoot(PowerInRate,number);
			//MessageBox("2");
		   break;
		 case 3:
			m_dMax_Y =max_PowerInTorque;
			m_dMin_Y =min_PowerInTorque;
			m_dMax_X =ptime[number-1];
			m_dMin_X =ptime[0];
			GetData(PowerInTorque,ptime,number,number);
			//获取统计信息
			m_Average=calculate_over.GetAverage(PowerInTorque,number);
			m_ds=calculate_over.GetRoot(PowerInTorque,number);
			//MessageBox("3");
	 	  break;
	    default:
		  break;
	}
		//销毁各个数组
		delete [] ptime;
		delete [] pPosition;
		delete [] PowerData;		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -