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

📄 drawdlgover.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		delete [] PowerInRate;
		//delete [] PowerOutRate;
		delete [] PowerInTorque;
		//delete [] PowerOutTorque;
		//绘制实时曲线
		Invalidate(FALSE);
	}
	else
	MessageBox("请点击主控窗口中的开始试验按钮按钮!");
	
}

//点击超载试验主控窗口开始按钮消息响应函数
void DrawDlgOver::OnMotoverstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("1");
	m_nHitnember = (int)wParam;
	int drawflag = (int)lParam;

	//打开数据为假
	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 DrawDlgOver::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	CMenu menu;
	menu.LoadMenu(IDR_OVERDRAW_RBDMENU);
	menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}

//保存位图
void DrawDlgOver::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 DrawDlgOver::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 DrawDlgOver::OnOpendata(WPARAM wParam, LPARAM lParam)
{
	//打开数据状态为真
	m_bOpenData =TRUE;
	/*--相当于点击主控窗口中的开始按钮-开始--*/
	m_bStartOn = TRUE;	//开始试验标志为真
	Uint_X="时间(S)";	//X坐标轴名称
	Uint_Y="效率";		//Y坐标轴名称	
	Title="超载试验    效率-时间曲线";  //标题名称
	m_nDrawType = 2;	
	Invalidate(FALSE);
	/*--相当于点击主控窗口中的开始按钮-结束--*/

	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();	
	
	//绘制实时曲线
	m_nDrawType =3;

	long number;		
	number = pApp->pCTestFormDoc->nPowerNumber; //每组数据个数	

	//定义各个数据数组
	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]=i;
		pPosition[i]=(long)i;
	}		
	//m_nHitnember=1;
	switch(m_nHitnember) 
	{
	 case 1:
		//MessageBox("1");
		m_dMax_Y =max_PowerData;
		m_dMin_Y =min_PowerData;
		//m_dMax_X =ptime[number-1];
		m_dMax_X =63;
		m_dMin_X =ptime[0];
		GetData(PowerData,ptime,number,number);
		//获取统计信息
		m_Average=calculate_over.GetAverage(PowerData,number);
		m_ds=calculate_over.GetRoot(PowerData,number);
		//MessageBox("2");
		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;
	}
	Invalidate(FALSE);  //触发画图		
}

//图形显示选择响应函数
void DrawDlgOver::OnDrawtypeSelect(WPARAM wParam, LPARAM lParam)
{
	CTestFormApp *pApp=(CTestFormApp *)AfxGetApp();
	m_nHitnember = (int)wParam;		//图形显示类型

	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;
	}

	if (m_bOpenData)	//试验开始
	{				
		//绘制实时曲线
		m_nDrawType =3;

		long number;		
		number = pApp->pCTestFormDoc->nPowerNumber; //当前数据个数		
			
		//定义各个数据数组
		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_PowerOutRate;
		double max_PowerOutTorque;
		//定义最小值
		double min_PowerData;
		double min_PowerOutRate;
		double min_PowerOutTorque;		

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

		switch(m_nHitnember) 
		{
		 case 1:
		//MessageBox("1");
			/*打开数据,默认为效率-时间曲线 效率相关信息*/
			//获取最大,最小值
			max_PowerData=calculate_over.FindMax(PowerData,number);		
			min_PowerData=calculate_over.FindMin(PowerData,number);
			//获取统计值		
			m_Average=calculate_over.GetAverage(PowerData,number);
			m_ds=calculate_over.GetRoot(PowerData,number);
			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);			
		   break;
		case 2:
			/*输出转速相关信息*/
			//获取最大,最小值
			max_PowerOutRate=calculate_over.FindMax(PowerOutRate,number);		
			min_PowerOutRate=calculate_over.FindMin(PowerOutRate,number);
			//获取统计值		
			m_Average=calculate_over.GetAverage(PowerOutRate,number);
			m_ds=calculate_over.GetRoot(PowerOutRate,number);

			m_dMax_Y =max_PowerOutRate;
			m_dMin_Y =min_PowerOutRate;
			m_dMax_X =ptime[number-1];
			m_dMin_X =ptime[0];
			GetData(PowerOutRate,ptime,number,number);		
			//MessageBox("2");
			break;
		case 3:
			/*输出扭矩相关信息*/
			//获取最大,最小值
			max_PowerOutTorque=calculate_over.FindMax(PowerOutTorque,number);		
			min_PowerOutTorque=calculate_over.FindMin(PowerOutTorque,number);
			//获取统计值		
			m_Average=calculate_over.GetAverage(PowerOutTorque,number);
			m_ds=calculate_over.GetRoot(PowerOutTorque,number);

			m_dMax_Y =max_PowerOutTorque;
			m_dMin_Y =min_PowerOutTorque;
			m_dMax_X =ptime[number-1];
			m_dMin_X =ptime[0];
			GetData(PowerOutTorque,ptime,number,number);		
			//MessageBox("3");
			break;
		  default:
			break;
		}		
	}
	Invalidate(FALSE);
}

⌨️ 快捷键说明

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