📄 ncapdlg.cpp
字号:
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rect;
GetWindowRect(rect);
ScreenToClient(rect);
CRect ctrrect;
/*
CWnd* pWnd = GetDlgItem(ID_BTN_ADD);
if (pWnd)
{
pWnd->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 40, rect.right - 10, rect.bottom - 40);
pWnd->MoveWindow(newrect);
}
pWnd = GetDlgItem(IDOK);
if (pWnd)
{
pWnd->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 15, rect.right - 10, rect.bottom - 15);
pWnd->MoveWindow(newrect);
}
pWnd = GetDlgItem(IDC_ADDDATA);
if (pWnd)
{
pWnd->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 65, rect.right - 10, rect.bottom - 65);
pWnd->MoveWindow(newrect);
}
pWnd = GetDlgItem(IDC_COMBO1);
if (pWnd)
{
pWnd->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
CRect newrect(rect.right - ctrrect.Width() - 10, ctrrect.top, rect.right - 10, ctrrect.bottom);
pWnd->MoveWindow(newrect);
}
*/
if (v_pCurveCtrl)
{
v_pCurveCtrl->GetWindowRect(ctrrect);
ScreenToClient(ctrrect);
CRect newrect(ctrrect.left, ctrrect.top, rect.right - 15, rect.bottom - 15);
v_pCurveCtrl->MoveWindow(newrect);
}
Invalidate();
}
//-------------------------------------------------------------------------------------------------
// 开始数据采集处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnStart()
{
// TODO: Add your control notification handler code here
CString v_sTemp; //临时变量
int v_iIndex; //临时变量
unsigned int *v_pVol_float; //临时变量
void *v_pVol_char; //临时变量
unsigned int v_iVoltage; //临时变量
CByteArray v_cData; //定义字节数组
UpdateData(true); //获取信息
if(!v_bStart)
{
SetTimer(1,v_iInput,NULL); //定时1:采集定时开始
m_cStart.SetWindowText("停止采集"); //显示处理
if(!v_bStart_new)
{
v_bStart_new=true; //新的数据采集标志
v_pCurveCtrl->m_fHoriBegin=float(0); //初始化显示X坐标:原点为0
v_pCurveCtrl->m_fHoriEnd=float(theApp.a_iNumber_page); //初始化显示X坐标:最大值为0
m_iPage=theApp.a_iNumber_page; //一屏显示点数
v_iIndex = v_pCurveCtrl->AddCurve("Test_0", v_sColours[0 % v_iColourCount].crColour);
//增加一条曲线、名称及其显示色彩
// v_pCurveCtrl->GetCurve(v_iIndex)->ShowCurve(); //显示无效(false)
v_pCurveCtrl->SetVertLabel(m_sUnit); //设置实验物理量
v_pCurveCtrl->SetHoriLabel(theApp.a_sXunit); //设置x轴显示内容
m_cInput.EnableWindow(false); //时间间隔无效
m_cInput_number.EnableWindow(false); //采集点数无效
m_cPara.EnableWindow(false); //参数设置无效
m_cQuery.EnableWindow(false); //数据查询无效
if(theApp.a_iChannel==0) //正弦曲线参数预处理
{
v_bAuto_stop=false;
m_cStop.SetCheck(false); //自动停止无效
v_bAuto_save=false;
m_cSave.SetCheck(false); //自动保存无效
m_iMove=1; //自动增加点数
}
//设置初始电位
if (theApp.a_iChannel==2) //串口数据处理
{
float v_fVoltage=theApp.a_fVoltage*1000; //计算初始电位数值
v_iVoltage=(unsigned int)v_fVoltage;
v_pVol_float=&v_iVoltage; //获得指针
v_pVol_char=v_pVol_float; //指针变换
v_cData.Add(0x01); //起始
v_cData.Add(0x07); //命令长度(全部)
v_cData.Add(0x33); //命令:设置初始电位
v_cData.Add(0x02); //数据开始
v_cData.Add(*((unsigned char*)v_pVol_char+1)); //高位
v_cData.Add(*(unsigned char*)v_pVol_char); //低位
v_cData.Add(0x03); //结束
m_cComm.SetOutput(COleVariant(v_cData)); //串口发送
}
}
m_cSave_man.EnableWindow(false); //手动保存无效
m_cClear.EnableWindow(false); //图形清除无效
}
else
{
KillTimer(1); //定时1:采集定时结束
m_cStart.SetWindowText("开始采集");
m_cSave_man.EnableWindow(true); //手动保存有效
m_cClear.EnableWindow(true); //图形清除有效
}
v_bStart=!v_bStart;
UpdateData(false); //更新显示
}
//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnQuery()
{
// TODO: Add your control notification handler code here
DLG_QUERY v_cDlg;
v_cDlg.DoModal();
}
//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnPara()
{
// TODO: Add your control notification handler code here
DLG_PARA v_cDlg;
v_cDlg.v_iDs_time=theApp.a_iDs_time; //时间间隔
v_cDlg.v_iNumber=theApp.a_iNumber; //采样点数
v_cDlg.v_iMove=theApp.a_iNumber_move; //自动移动点数
v_cDlg.v_iPage=theApp.a_iNumber_page; //一屏显示点数
v_cDlg.v_iAppend=theApp.a_iNumber_append; //自动增加点数
v_cDlg.v_sIp=theApp.a_sIp; //网络IP
v_cDlg.v_iPort=theApp.a_iPort; //网络port
v_cDlg.v_iCom=theApp.a_iCom; //串口端口
v_cDlg.v_iCom_bit=theApp.a_iBit; //串口速率
v_cDlg.v_iChannel=theApp.a_iChannel; //采集通道
v_cDlg.v_bSave=theApp.a_bAuto_save; //保存
v_cDlg.v_bStop=theApp.a_bAuto_stop; //停止
v_cDlg.v_iAuto_move=theApp.a_iAuto_move; //移动、增加选择
v_cDlg.v_sUnit=theApp.a_sUnit; //物理量
v_cDlg.v_sName=theApp.a_sName; //实验名称
v_cDlg.v_iMultiple=theApp.a_iMultiple; //放大倍数
v_cDlg.v_fVoltage=theApp.a_fVoltage; //放大倍数
if (v_cDlg.DoModal()==IDOK)
We_status(); //状态显示
}
//-------------------------------------------------------------------------------------------------
// 功能:自动保存复选窗处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSave()
{
// TODO: Add your control notification handler code here
v_bAuto_save=m_cSave.GetCheck(); //获得自动保存标志
}
//-------------------------------------------------------------------------------------------------
// 功能:自动采集停止处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnStop()
{
// TODO: Add your control notification handler code here
v_bAuto_stop=m_cStop.GetCheck(); //获得自动停止采集标志
}
//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnChangeInput()
{
// TODO: Add your control notification handler code here
UpdateData(true); //获取屏幕数据
v_iInput=m_iInput; //赋值
}
//-------------------------------------------------------------------------------------------------
// 采集点数变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnChangeInputNumber()
{
// TODO: Add your control notification handler code here
UpdateData(true); //获取屏幕数据
v_iInput_number=m_iInput_number; //赋值
}
//-------------------------------------------------------------------------------------------------
// 清除所有绘制的图形
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnClear()
{
// TODO: Add your control notification handler code here
//清除参比电极电压(设置为零)
if (theApp.a_iChannel==2) //串口数据处理
{
CByteArray v_cData; //定义字节数组
v_cData.Add(0x01); //起始
v_cData.Add(0x07); //命令长度(全部)
v_cData.Add(0x33); //命令:设置初始电位
v_cData.Add(0x02); //数据开始
v_cData.Add(0x00); //高位:00
v_cData.Add(0x00); //低位:00
v_cData.Add(0x03); //结束
m_cComm.SetOutput(COleVariant(v_cData)); //串口发送
}
//采集数据、图形显示处理
v_pCurveCtrl->RemoveAll(); //清除所有绘制的图形
v_pCurveCtrl->m_fVertMax=-FLT_MAX / 2; //数据最大值复位
v_pCurveCtrl->m_fVertMin=FLT_MAX / 2; //数据最小值复位
v_pCurveCtrl->Invalidate(); //显示处理
v_iX_number=-1; //数据采集x计数复位
v_iCurveCount=0; //绘制图形序号
v_bStart_new=false; //新的数据采集标志
m_iPage=theApp.a_iNumber_page; //一屏显示点数
m_cSave_man.EnableWindow(false); //手动保存无效
m_cClear.EnableWindow(false); //图形清除无效
m_cInput.EnableWindow(true); //时间间隔有效
m_cInput_number.EnableWindow(true); //采集点数有效
m_cPara.EnableWindow(true); //参数设置有效
m_cQuery.EnableWindow(true); //数据查询有效
m_cStart.EnableWindow(true); //开始采集有效
}
//-------------------------------------------------------------------------------------------------
// 功能:手动保存采集数据
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSaveMan()
{
// TODO: Add your control notification handler code here
CString v_sSql,v_sSql1,v_sName,v_sDs_time,v_sNumber,v_sChannel,v_sUnit;
//临时变量
CTime v_tTime; //临时变量
int v_iNum; //临时变量
bool v_bFlag; //临时变量
UpdateData(true); //获取屏幕输入数据
v_sName=m_sName; //实验名称
v_sName.TrimLeft();
v_sUnit=m_sUnit; //实验物理单位
v_sUnit.TrimLeft();
v_tTime=CTime::GetCurrentTime();
v_sDs_time.Format("%d",v_iInput); //时间间隔
v_sNumber.Format("%d",v_iX_number); //实际采集点数
v_sChannel.Format("%d",theApp.a_iChannel); //通道号
//把采集数的据保存到数据库
v_sSql="INSERT INTO query (znum,zname,zdate,zds_time,znumber,zchannel,zunit) VALUES ('"
+m_sNumber //实验编号
+"','"+v_sName //实验名称
+"','"+v_tTime.Format("%Y-%m-%d")+" "+v_tTime.Format("%H:%M:%S")
// 设置日期
+"',"+v_sDs_time //时间间隔
+","+v_sNumber //采集点数
+","+v_sChannel //通道
+",'"+v_sUnit+"')"; //物理单位
We_save(v_sSql); //数据库保存:实验运行信息数据库
v_bFlag=true;
for(v_iNum=0;v_iNum<=v_iX_number;v_iNum++) //保存采集数据到数据库
{
if (v_bFlag)
{
v_bFlag=false;
v_sSql="INSERT INTO information (znum";
v_sSql1=") VALUES ('"+m_sNumber+"'";
}
v_sName.Format("%02d",v_iNum%50);
v_sSql+=",znr"+v_sName;
v_sName.Format("%.4f",v_fData[v_iNum]);
v_sSql1+=","+v_sName; //采集数据
if(((v_iNum+1)%50==0)||(v_iNum==v_iX_number))
{
v_sSql+=v_sSql1+")";
We_save(v_sSql); //数据库保存:实验数据采集数据库
v_bFlag=true;
}
}
//保存后运行参数及显示处理
m_cStart.EnableWindow(false); //开始采集无效
m_cSave_man.EnableWindow(false); //手动保存无效
theApp.a_iNum++; //实验序号加一
v_sSql.Format("%d",theApp.a_iNum);
v_sSql="UPDATE state SET znum="+v_sSql; //sql命令
We_save(v_sSql); //数据库保存
m_sNumber.Format("%04d",theApp.a_iNum);
m_sNumber=theApp.a_sDate+"_"+m_sNumber; //实验编号
UpdateData(false); //显示信息
}
//-------------------------------------------------------------------------------------------------
// 定时处理
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
float v_fX,v_fY; //座标变量
CString v_sTemp; //临时变量
int v_iIndex; //临时变量
switch(nIDEvent)
{
case 1: //定时1:
//正弦数据处理
if (theApp.a_iChannel==0) //正弦数据处理
{
v_iX_number=-1; //数据采集x计数复位
v_iCurveCount++; //绘制图形序号
v_sTemp.Format("Test_%d", v_iCurveCount); //曲线名称
v_iIndex=v_pCurveCtrl->AddCurve(v_sTemp, v_sColours[v_iCurveCount % v_iColourCount].crColour);
//增加一条曲线、名称及其显示色彩
for (v_fX = 0 ; v_fX <128; v_fX++)
{
v_iX_number=v_iX_number+v_iCurveCount; //数据采集x计数
v_fY=float(10.0)*float(v_iCurveCount)*float((sin(v_fX/20)));
We_adddate(v_fX*v_iCurveCount,v_fY,v_iIndex); //增加绘图数据
//数值计算
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -