drawdlgpower.cpp
来自「一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.」· C++ 代码 · 共 1,213 行 · 第 1/3 页
CPP
1,213 行
calculate_power.BubUp(PowerInTorque,pPosition,number);
//获取排序后的效率值
for (int j=0;j<number;j++)
{
PowerDataSort[j]=PowerData[pPosition[j]];
}
*/
/*///--------测试开始-------------////
CString str;
str.Format("%d",m_nHitnember);
MessageBox(str);
////--------测试结束-------------///*/
switch(m_nHitnember)
{
case 1:
//MessageBox("1");
/*效率相关信息*/
//获取最大,最小值
max_PowerData=calculate_power.FindMax(PowerData,number);
min_PowerData=calculate_power.FindMin(PowerData,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerData,number);
m_ds=calculate_power.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_power.FindMax(PowerOutRate,number);
min_PowerOutRate=calculate_power.FindMin(PowerOutRate,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutRate,number);
m_ds=calculate_power.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_power.FindMax(PowerOutTorque,number);
min_PowerOutTorque=calculate_power.FindMin(PowerOutTorque,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutTorque,number);
m_ds=calculate_power.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);
}
else
MessageBox("请点击主控窗口中的开始试验按钮按钮!");
}
//右键点击菜单
void DrawDlgPower::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 DrawDlgPower::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 DrawDlgPower::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 DrawDlgPower::OnOpendata(WPARAM wParam, LPARAM lParam)
{
//MessageBox("123");
//打开数据状态为真
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 *PowerOutRate=new double [number];
double *PowerOutTorque=new double [number];
double *ptime=new double [number];//存放时间坐标
long *pPosition=new long [number];//存放位置
PowerData = pApp->pCTestFormDoc->pPowerData;
PowerOutRate = pApp->pCTestFormDoc->pPowerOutRate;
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_power.FindMax(PowerData,number);
min_PowerData=calculate_power.FindMin(PowerData,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerData,number);
m_ds=calculate_power.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_power.FindMax(PowerOutRate,number);
min_PowerOutRate=calculate_power.FindMin(PowerOutRate,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutRate,number);
m_ds=calculate_power.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_power.FindMax(PowerOutTorque,number);
min_PowerOutTorque=calculate_power.FindMin(PowerOutTorque,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutTorque,number);
m_ds=calculate_power.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); //触发画图
}
void DrawDlgPower::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 *PowerDataSort=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_power.FindMax(PowerData,number);
min_PowerData=calculate_power.FindMin(PowerData,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerData,number);
m_ds=calculate_power.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_power.FindMax(PowerOutRate,number);
min_PowerOutRate=calculate_power.FindMin(PowerOutRate,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutRate,number);
m_ds=calculate_power.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_power.FindMax(PowerOutTorque,number);
min_PowerOutTorque=calculate_power.FindMin(PowerOutTorque,number);
//获取统计值
m_Average=calculate_power.GetAverage(PowerOutTorque,number);
m_ds=calculate_power.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);
}
void DrawDlgPower::OnOK( )
{
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?