drawdlgpower.cpp

来自「一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.」· C++ 代码 · 共 1,213 行 · 第 1/3 页

CPP
1,213
字号
	
	//设置字体
	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);
}

//创建字体
void DrawDlgPower::CreateMyFont()
{
	LOGFONT Font;
	memset(&Font, 0, sizeof(LOGFONT));
	lstrcpy(Font.lfFaceName, "Times New Roman");
	CWindowDC wdc(NULL) ;
	const int cyPixels = wdc.GetDeviceCaps(LOGPIXELSY);

	//标题用笔,粗体
	Font.lfHeight = -1 * MulDiv(9, cyPixels, 72);
	Font.lfUnderline=false;//不带下划线
	Font.lfWeight = FW_BOLD ;
	Title_Font.CreateFontIndirect(&Font);	

	//X轴标题显示用字体
	Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
	Font.lfUnderline=false;//不带下划线
	Font.lfWeight = FW_BOLD ;
	Title_Font_X.CreateFontIndirect(&Font);

	//Y轴标题显示用字体
	Font.lfWeight =FW_BOLD;
	Font.lfOrientation = 900; // Rotate font 90 degree for x axis
	Font.lfEscapement = 900;  
	Font.lfUnderline=false;//不带下划线
	Font.lfHeight = -1 * MulDiv(8, cyPixels, 70);
	Title_Font_Y.CreateFontIndirect(&Font);

	//标定文字用笔,不加粗
	Font.lfWeight = FW_THIN ;
	Font.lfOrientation = 0; // Rotate font 90 degree for x axis
	Font.lfEscapement = 0;
	Font.lfUnderline=false;//不带下划线
	Font.lfHeight = -1 * MulDiv(7, cyPixels, 70);
	Label_Font_X.CreateFontIndirect(&Font);

	//显示信息标题用字体,带下划线,加粗
	Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
	Font.lfWeight = FW_THIN ;
	Font.lfUnderline=true;//带下划线
	Message_Bottom.CreateFontIndirect(&Font);

	//显示信息用字体,不带下划线,不加粗
	Font.lfHeight = -1 * MulDiv(8, cyPixels, 72);
	Font.lfWeight = FW_BOLD ;
	Font.lfUnderline=FALSE;//带下划线
	Message_Font.CreateFontIndirect(&Font);
	
	//竖排显示字体
	//Font.lfWeight = FW_THIN ;
	Font.lfWeight =FW_BOLD;
	Font.lfOrientation = 900; // Rotate font 90 degree for x axis
	Font.lfEscapement = 900;  
	Font.lfUnderline=false;//不带下划线
	Font.lfHeight = -1 * MulDiv(8, cyPixels, 70);
	Label_Font_Y.CreateFontIndirect(&Font);

}

//画x轴的示数
void DrawDlgPower::DrawLabelX(CDC *pDC, double Xmax_time, double Xmin_time)
{
	pDC->FillRect(m_LabelRect_X,&CBrush(m_LabelColor));
	//pDC->FillRect(m_LabelRect_X,&CBrush(RGB(255,255,255)));
	//设置字体
	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);	
	double XStep=63.0/(m_GridX+1);
	for (int i=0;i<m_GridX+2;i++)
	{		
		pp.x=m_PlotRect.left+i*m_PlotRect.Width()/(m_GridX+1)+2;
		pp.y=m_LabelRect_X.top;		
		str.Format("%.1f",i*XStep+Xmin_time);
		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 DrawDlgPower::DrawLabelY(CDC *pDC, double Ymax_time, double Ymin_time)
{
	pDC->FillRect(m_LabelRect_Y,&CBrush(m_LabelColor));
	//pDC->FillRect(m_LabelRect_Y,&CBrush(RGB(255,255,255)));

	//设置字体
	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)-8;
		pp.x=m_LabelRect_Y.left+m_LabelRect_Y.Width()/2-2;	
		str.Format("%4.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 DrawDlgPower::DrawMessage(CDC *pDC)
{
	pDC->FillRect(m_TextOutRect,&CBrush(m_LabelColor));	
	//pDC->FillRect(m_TextOutRect,&CBrush(RGB(255,255,255)));	
	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);	

	/*统计信息*/
	//calculate_power
	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+65,"统计信息");
	pDC->SelectObject(&Label_Font_X);
	str1.Format("平均值:%5.4f",m_Average);
	str2.Format("均方值:%5.4f",m_ds);
	str3.Format("最大值:%5.4f",m_dMax_Y);
	str4.Format("最小值:%5.4f",m_dMin_Y);
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+81,str1);	
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+96,str2);
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+111,str3);	
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+126,str4);
	/*峰值信息*/
	//GetPeakData();//得到峰值信息
	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+155,"峰值信息");	
	pDC->SelectObject(&Label_Font_X);

	str3.Format("%s",Uint_X);	
	str4= "峰值";
	pDC->TextOut(m_TextOutRect.left+4,m_TextOutRect.top+172,"序号");
	pDC->TextOut(m_TextOutRect.left+32,m_TextOutRect.top+172,str4);
	pDC->TextOut(m_TextOutRect.left+65,m_TextOutRect.top+172,str3);
	double peak;
	long pos;
	int peakn;
	long startpos;
	
	if (m_bDataReady)//数据准备好
	{
		startpos=(long)m_dMin_X;

		GetPeakData();//得到峰值信息
		
		if(m_Peak_Num>10)
			peakn=10;
		else
			peakn=m_Peak_Num;

		for(int i=0;i<peakn;i++)
		{
			peak=data_Peak[i];
			pos=data_Peak_pos[i];

			str1.Format("%d ",i+1);
			str2.Format("%5.3f",peak);		
			str3.Format("%d",pos+startpos);
			//MessageBox(str3);
		
			pDC->TextOut(m_TextOutRect.left+10,m_TextOutRect.top+185+i*15,str1);		
			pDC->TextOut(m_TextOutRect.left+30,m_TextOutRect.top+185+i*15,str2);		
			pDC->TextOut(m_TextOutRect.left+72,m_TextOutRect.top+185+i*15,str3);
		}
	}
		pDC->SelectObject(OldFont);
}

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

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

	//从大到小排序
	calculate_power.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 DrawDlgPower::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 DrawDlgPower::OnMotpowstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("1");
	m_nHitnember = (int)wParam;
	int drawflag = (int)lParam;
/*///--------测试开始-------------////
	CString str;
	str.Format("%d",m_nHitnember);
	MessageBox(str);
////--------测试结束-------------///*/

	//打开数据状态为假
	m_bOpenData =FALSE;
	//开始试验标志为真
	m_bStartOn = TRUE;

	switch(m_nHitnember) 
	{
		case 1:
			Uint_X="时间(S)";  //X坐标轴名称
			Uint_Y="效率";  //Y坐标轴名称	
			Title="效率试验    效率-时间曲线";  //标题名称
		//MessageBox("1");
		break;
		case 2:
			Uint_X="时间(S)";  //X坐标轴名称
			Uint_Y="转速(RPM)";  //Y坐标轴名称	
			Title="效率试验    转速-时间曲线";  //标题名称
		//MessageBox("2");
		break;
		case 3:
			Uint_X="时间(S)";  //X坐标轴名称
			Uint_Y="扭矩(N.m)";  //Y坐标轴名称	
			Title="效率试验    扭矩-时间曲线";  //标题名称
		//MessageBox("3");
		break;
	default:
		break;
	}
	switch(drawflag)
	{
	case 1:
		m_nDrawType = 2;
		//m_bStartOn = TRUE;
		//m_bDrawOn = TRUE;
		break;
	default:
		m_nDrawType = 0;
		//m_bStartOn = FALSE;
		//m_bDrawOn = FALSE;
		break;
	}
	Invalidate(FALSE);
}

//效率仪读取数据达到设定值的消息响应函数
void DrawDlgPower::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/(datasize/2.0));
		long startpos=(long)(ntimes*(datasize/2.0));

		//定义各个数据数组
		double *PowerData=new double [datasize];
		double *PowerDataSort=new double [datasize];//存放排序后的效率值
		//double *PowerInRate=new double [datasize];
		double *PowerOutRate=new double [datasize];
		//double *PowerInTorque=new double [datasize];
		double *PowerOutTorque=new double [datasize];	
		
		double *ptime=new double [datasize];//存放时间坐标
		long *pPosition=new long [datasize];//存放位置

		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_PowerOutRate;
		double max_PowerOutTorque;
		//定义最小值
		double min_PowerData;
		double min_PowerOutRate;
		double min_PowerOutTorque;		

		//获取时间坐标刻度
		for (int i=0;i<number;i++)
		{
			ptime[i]=startpos+i;
			pPosition[i]=(long)i;
		}
/*
		//升序排序
		//输入转速排序
		calculate_power.BubUp(PowerInRate,pPosition,number);
		//输入扭矩排序

⌨️ 快捷键说明

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