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

📄 drawdlgprv.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//设置字体
	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 DrawDlgPrv::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 DrawDlgPrv::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-6;
	pDC->TextOut(a_t,b_t,"传动精度");
	//数据	
	a_t=m_TextOutRect.left+xwidth/2-10;	
	b_t=m_TextOutRect.bottom/6-3;
	str1.Format("%5.2f",m_dTransError);
	pDC->TextOut(a_t,b_t,str1);

	/*设定图形信息显示坐标*/
	pDC->SelectObject(&Title_Font);
	pDC->SetBkMode(TRANSPARENT);//设置为透明
	pDC->SetTextAlign(TA_CENTER);//设置为字体居中
	//标题
	a_t=m_TextOutRect.left+xwidth/2-10;	
	b_t=m_TextOutRect.bottom/5+10;
	pDC->TextOut(a_t,b_t,"图形信息");

	pDC->SetTextAlign(TA_LEFT);

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

	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+95,"统计信息");
	pDC->SelectObject(&Label_Font_X);
	str1.Format("平均值:%5.2f",m_Average);
	str2.Format("均方值:%5.2f",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+113,str1);	
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+123,str2);
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+133,str3);	
	pDC->TextOut(m_TextOutRect.left+15,m_TextOutRect.top+143,str4);
	/*峰值信息*/
	pDC->SelectObject(&Message_Bottom);
	pDC->TextOut(m_TextOutRect.left+5,m_TextOutRect.top+165,"峰值信息");	
	pDC->SelectObject(&Label_Font_X);

	str3.Format("%s",Uint_X);	
	str4= "峰值";
	pDC->TextOut(m_TextOutRect.left+4,m_TextOutRect.top+180,"序号");
	pDC->TextOut(m_TextOutRect.left+32,m_TextOutRect.top+180,str4);
	pDC->TextOut(m_TextOutRect.left+65,m_TextOutRect.top+180,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+195+i*15,str1);		
			pDC->TextOut(m_TextOutRect.left+30,m_TextOutRect.top+195+i*15,str2);		
			pDC->TextOut(m_TextOutRect.left+72,m_TextOutRect.top+195+i*15,str3);
		}
	}
	pDC->SelectObject(OldFont);
}

//得到峰值信息
void DrawDlgPrv::GetPeakData()
{

	double *temp=new double [m_Y_Long];
	long *temp_pos=new long [m_Y_Long];
	
	//调用求峰值函数	
	m_Peak_Num=calculate_prv.FindPeak(dataShow_Y,temp,temp_pos,m_Y_Long);	
	//从大到小排序
	calculate_prv.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;
			}
		}

	}
	delete [] temp_pos;
	delete [] temp;	
}

//获取采集窗口的数据
void DrawDlgPrv::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 DrawDlgPrv::OnCoderDaqFinish(WPARAM wParam, LPARAM lParam)
{
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();	
	
	if (m_bStartOn)
	{
		//绘制实时曲线
		m_nDrawType =3;

		long number;		
		number = pApp->pCTestFormDoc->nTotalCoderNumber; //数据个数			

		//定义各个数据数组
		double *CoderData=new double [number+1];
		double *CoderDataSort=new double [number];//存放处理后的数据		
		
		double *pPosition=new double [number];//存放点数即X轴坐标,为保持获取数据函数的
												//完整性,固将其定义为双精度

		CoderData = pApp->pCTestFormDoc->pCoderData;
		for (int j=0;j<number;j++)
		{
			CoderDataSort[j]=360-fabs(CoderData[j+1]-CoderData[j]);
			CoderDataSort[j]=CoderDataSort[j]-(360.0/number);
		}
		
		/*定义需要显示数组的最大最小值*/
		//定义最大值
		double max_ErrorData;
		//定义最小值
		double min_ErrorData;

		//获取最大,最小值
		max_ErrorData=calculate_prv.FindMax(CoderDataSort,number);
		min_ErrorData=calculate_prv.FindMin(CoderDataSort,number);

		//获取时间坐标刻度
		for (int i=0;i<number;i++)
		{			
			pPosition[i]=i;
		}
		GetData(CoderDataSort,pPosition,number,number);

		//销毁各个数组		
		delete [] pPosition;
		delete [] CoderData;
		delete [] CoderDataSort;
	}
		//绘制实时曲线
		Invalidate(FALSE);
}

//点击传动精度试验主控窗口开始按钮消息响应函数
void DrawDlgPrv::OnMotprvstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("12");
	int drawflag = (int)lParam;
	//开始试验标志为真
	m_bStartOn = TRUE;
	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;
	}
	//设置标题
	Uint_X="点数";		//X坐标轴名称
	Uint_Y="输出轴传动误差";			//Y坐标轴名称	
	Title="传动精度试验     输出轴传动误差曲线"; //标题名称

	//触发画图
	Invalidate(FALSE);
}


//右键点击菜单
void DrawDlgPrv::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	CMenu menu;
	menu.LoadMenu(IDR_POWERDRAW_RBDMENU);
	menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}

//保存位图
void DrawDlgPrv::OnMenuSavebitmap() 
{
	// TODO: Add your command handler code here

	m_bSaveBitmap=TRUE;	//保存位图(保存试验实时曲线)标志
	Invalidate(FALSE);  //触发画图
	
	if (m_bBitmapReady)//位图创建成功
	{
		CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
			"位图文件(*.bmp)|*.bmp|",NULL);
		if(dlg.DoModal()== IDOK) 
		{
		CString filename = dlg.GetFileName() + ".bmp";
		 BITMAPFILEHEADER bmfh;
		ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
		*((char *)&bmfh.bfType) = 'B';
		*(((char *)&bmfh.bfType) + 1) = 'M';
		bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
		
		bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
		//文件头的这个变量表示的是文件的大小
		
		TCHAR szBMPFileName[128];
		//文件名
		int iBMPBytes = iWidth * iHeight * iPixel / 8;
		//位图总像素大小
		strcpy(szBMPFileName,filename);
		//获得文件名
		CFile file;
		
		if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
		{
			file.Write(&bmfh,sizeof(BITMAPFILEHEADER));//先写入文件头信息到文件中

			file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));//写入文件信息结构

			file.Write(pBits,iBMPBytes);//写入位图像素数据信息
			
			file.Close();
		}
		}
	}
	else //位图创建未成功
		MessageBox("请先进行设备自检和开始试验操作试验!");
}

//创建位图
void DrawDlgPrv::CreatBitmap()
{
	//得到矩形大小
	CRect rect;
	GetClientRect(&rect);
	iWidth =rect.Width();
	iHeight =rect.Height();
    iPixel = 32;
	pBits =  new byte[iWidth * iHeight * iPixel / 8];
	 
	//初始图形格式参数
    //设置位图信息的bmiHeader分量信息,即位图的BITMAPINFOHEADER信息 
	lpbmih = new BITMAPINFO;  
	lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	lpbmih->bmiHeader.biWidth = iWidth;
	lpbmih->bmiHeader.biHeight = iHeight;
	lpbmih->bmiHeader.biPlanes = 1;
	lpbmih->bmiHeader.biBitCount = iPixel;
	lpbmih->bmiHeader.biCompression = BI_RGB;
	lpbmih->bmiHeader.biSizeImage = 0;
	lpbmih->bmiHeader.biXPelsPerMeter = 0;
	lpbmih->bmiHeader.biYPelsPerMeter = 0;
	lpbmih->bmiHeader.biClrUsed = 0;
	lpbmih->bmiHeader.biClrImportant = 0;
	//////////////////////////////////////////////////////////////////////////
	hBitMap = CreateDIBSection(m_pMemory,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
	//上条语句联系lpbmih信息以及pBits信息
	pBitMap = new CBitmap;
	pBitMap->Attach(hBitMap);//绑定
	m_pMemory.SelectObject(pBitMap);
	//m_pMemory.FillRect(m_ClientRect,&CBrush(m_BkColor));	
}

//打开数据响应函数
void DrawDlgPrv::OnOpendata(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("3");
	/*--相当于点击主控窗口中的开始按钮-开始--*/
	m_bStartOn = TRUE;	//开始试验标志为真	
	Uint_X="点数";		//X坐标轴名称
	Uint_Y="输出轴传动误差";			//Y坐标轴名称	
	Title="传动精度试验     输出轴传动误差曲线"; //标题名称
	m_nDrawType = 2;	
	Invalidate(FALSE);
	/*--相当于点击主控窗口中的开始按钮-结束--*/
	
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();		
	//绘制实时曲线
	m_nDrawType =3;
	long number;
		
	number = pApp->pCTestFormDoc->nTotalCoderNumber; //数据个数	
	m_X_Long=number;		//x向数组大小
	m_Y_Long=number;		//y向数组大小

	//定义各个数据数组
	double *CoderDataSort=new double [number];//存放处理后的数据	
	double *pPosition=new double [number];//存放点数即X轴坐标,为保持获取数据函数的
												//完整性,固将其定义为双精度	
	for (int j=0;j<number;j++)
	{
		CoderDataSort[j] = pApp->pCTestFormDoc->pErrorData[j];
	}
		
	/*定义需要显示数组的最大最小值*/
	//定义最大值
	double max_ErrorData;
	//定义最小值
	double min_ErrorData;

	//获取最大,最小值
	max_ErrorData=calculate_prv.FindMax(CoderDataSort,number);
	min_ErrorData=calculate_prv.FindMin(CoderDataSort,number);
	m_Average=calculate_prv.GetAverage(CoderDataSort,number);
	m_ds=calculate_prv.GetRoot(CoderDataSort,number);
	//求得传动误差
	m_dTransError=max_ErrorData-min_ErrorData;

	//获取时间坐标刻度
	for (int i=0;i<number;i++)
	{			
		pPosition[i]=i;
	}

	m_dMax_Y = max_ErrorData;
	m_dMin_Y = min_ErrorData;
	m_dMax_X = pPosition[number-1];
	m_dMin_X = pPosition[0];
	GetData(CoderDataSort,pPosition,number,number);
	
	//绘制实时曲线
	Invalidate(FALSE);
}

⌨️ 快捷键说明

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