📄 dlg_draw.cpp
字号:
v_pCurveCtrl->m_fHoriEnd=float(v_pCurveCtrl->m_fHoriBegin+v_iPage); //初始化显示X坐标:一屏显示
v_pCurveCtrl->Invalidate(); //图形显示
//屏幕按钮控制
// if(v_iNum==0) //到达原点?
// m_cLeft.EnableWindow(false); //左移按钮无效
// if(v_pCurveCtrl->m_fHoriEnd<v_iXmax_dot) //小于最大采集点数
// m_cRight.EnableWindow(true); //右移按钮有效
}
//-------------------------------------------------------------------------------------------------
// 功能:图形绘制->右移一点
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnRight()
{
// TODO: Add your control notification handler code here
int v_iNum; //临时变量
//显示位置控制
v_iNum=v_pCurveCtrl->m_fHoriBegin+v_iMove_num; //右移移动点数
v_pCurveCtrl->m_fHoriBegin=float(v_iNum); //初始化显示X坐标:原点为v_iNum
v_pCurveCtrl->m_fHoriEnd=float(v_pCurveCtrl->m_fHoriBegin+v_iPage); //初始化显示X坐标:一屏显示
v_pCurveCtrl->Invalidate(); //图形显示
//屏幕按钮控制
// if(v_pCurveCtrl->m_fHoriBegin>0) //大雨原点?
// m_cLeft.EnableWindow(true); //左移按钮有效
// if(v_iNum+v_iPage>=v_iXmax_dot+2) //大于最大采集点数
// m_cRight.EnableWindow(false); //右移按钮无效
}
//-------------------------------------------------------------------------------------------------
// 功能:图形绘制->全屏
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnAll()
{
// TODO: Add your control notification handler code here
//显示位置控制
v_iPage=v_iXmax_page; //全屏显示点数
v_pCurveCtrl->m_fHoriBegin=float(0); //初始化显示X坐标:原点为0
v_pCurveCtrl->m_fHoriEnd=float(v_iPage); //全屏显示
v_pCurveCtrl->Invalidate(); //图形显示
//屏幕按钮控制
m_cAdd.EnableWindow(v_iXmax_page>10?true:false); //放大有/无效
m_cDec.EnableWindow(false); //缩小无效
}
//-------------------------------------------------------------------------------------------------
// 功能:移动点数数据选择变化处理(移动点数下拉窗处理)
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnSelchangeMoveNum()
{
// TODO: Add your control notification handler code here
int v_iNum; //临时变量
CString v_sTemp; //临时变量
m_cMove_num.GetLBText(m_cMove_num.GetCurSel(),v_sTemp); //获得窗口选项的内容
v_iNum=atoi(v_sTemp); //数字化
if (v_iNum>0)
v_iMove_num=v_iNum; //赋值
}
//-------------------------------------------------------------------------------------------------
// 功能:鼠标滚轮消息响应
// 参数:zDelta=120向前(放大);zDelta=120向后(缩小);
//-------------------------------------------------------------------------------------------------
BOOL DLG_DRAW::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
if(zDelta>0)
We_add(pt); //图形放大
else
OnDec(); //图形缩小
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
//-------------------------------------------------------------------------------------------------
// 功能:Y轴比例变化响应
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnYScale()
{
// TODO: Add your control notification handler code here
if(!m_cY_scale.GetCheck())
{
OnAll(); //满屏显示
v_pCurveCtrl->ReCalcAllVert(); //重新计算Y轴数据范围
OnAll(); //满屏显示
}
v_pCurveCtrl->m_bVert=m_cY_scale.GetCheck(); //修改Y轴比例标志
}
//-------------------------------------------------------------------------------------------------
// 功能:曲线放大
// 参数:pt:mouse坐标
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::We_add(CPoint pt)
{
// TODO: Add your control notification handler code here
int v_iNum; //临时变量
//一屏显示点数计算
if(v_iPage<=10) //小于一屏最小点数
return;
v_iNum=v_iPage/2; //计算一屏显示点数(放大一倍)
if(v_iNum<10) //小于一平最小点数
v_iNum=10;
v_iPage=(int(v_iNum/10-0.5)+1)*10; //一屏显示点数
//显示位置计算
v_pCurveCtrl->CalcAllAdd(pt,v_iPage); //图形显示
//屏幕按钮控制
if(v_pCurveCtrl->m_fHoriBegin>0) //大于原点?
m_cDec.EnableWindow(true); //缩小有效
if(v_pCurveCtrl->m_fHoriEnd<v_iXmax_dot) //小于最大采集点数?
m_cDec.EnableWindow(true); //缩小有效
if(v_iPage<=10) //小于一屏最小点数
m_cAdd.EnableWindow(false); //放大无效
}
//-------------------------------------------------------------------------------------------------
// 功能:读取数据库信息
// 参数:v_sName:实验编号
// v_sNum:绘图名称
// v_iNum:采集点数
//-------------------------------------------------------------------------------------------------
bool DLG_DRAW::We_open(CString v_sName,CString v_sNum,int v_iNum)
{
int v_iNumber,v_iNumber1; //临时变量
CString v_sTemp; //临时变量
float v_fY; //座标变量
_RecordsetPtr v_pRecordset; //数据库记录指针
try
{
ADOConn v_cAdoConn; // 数据库实例
v_cAdoConn.OnInitADOConn(theApp.a_iDatabase_Type,theApp.a_sDatabase_Ip,theApp.a_sDatabase_Name,theApp.a_sDatabase_User,theApp.a_sDatabase_Password);
//连接数据库
if (!v_cAdoConn.m_bFlag)
{
v_cAdoConn.ExitConnect(); //断开连接
return false;
}
_bstr_t v_sSql="SELECT * FROM information where znum='"+v_sName+"' order by zauto";
//设置查询语句
v_pRecordset = v_cAdoConn.GetRecordSet(v_sSql); //执行SELETE语句
if (!v_cAdoConn.m_bFlag)
return false;
v_iNumber1=0; //复位:一条记录计数,每条50个实验数据
while (!v_pRecordset->adoEOF)
{
for(v_iNumber=0;v_iNumber<=49;v_iNumber++)
{
v_sTemp.Format("%02d",v_iNumber);
v_sTemp="znr"+v_sTemp;
if(v_pRecordset->Fields->GetItem((_variant_t)v_sTemp)->ActualSize>0)
//读取 采集点数
v_fY = v_pRecordset->GetCollect((_variant_t)v_sTemp).fltVal;
else v_fY = 0;
v_pCurveCtrl->AddData(v_sNum, v_iNumber+v_iNumber1*50, v_fY);
//增加图形数据
v_iNum--;
if(v_iNum<0)
break;
}
if(v_iNum<0)
break;
v_iNumber1++; //加一
v_pRecordset->MoveNext();
}
v_cAdoConn.ExitConnect(); //断开连接
}
catch(_com_error e) //捕捉异常
{
UpdateData(false);
MessageBox(" 数据库操作失败! ","信息提示",MB_OK);
return false;
}
UpdateData(false);
return true;
}
//-------------------------------------------------------------------------------------------------
// 功能:执行数据库命令
//-------------------------------------------------------------------------------------------------
bool DLG_DRAW::We_save(CString v_sSql)
{
// TODO: Add your control notification handler code here
bool v_bReturn=true;
ADOConn v_cAdoConn; // 数据库实例
v_cAdoConn.OnInitADOConn(theApp.a_iDatabase_Type,theApp.a_sDatabase_Ip,theApp.a_sDatabase_Name,theApp.a_sDatabase_User,theApp.a_sDatabase_Password);
// 连接数据库
if (!v_cAdoConn.ExecuteSQL((_bstr_t)v_sSql)) // 执行数据库操作
v_bReturn=false;
v_cAdoConn.ExitConnect(); //断开连接
return v_bReturn;
}
//-------------------------------------------------------------------------------------------------
// 功能:读取采集的数据
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnRead()
{
// TODO: Add your control notification handler code here
CString v_sTemp,v_sUnit; //临时变量
CString v_sFileName; //文件名称
CFile v_cRead_file; //文件实例
char v_bBuffer[1000]; //数据缓冲区
int v_iLen; //读取文件长度
int v_iData; //读取数据计数
int v_iSum; //采集点数
float* v_pData; //浮点数指针
float v_fData; //浮点数
CFileDialog dlg(TRUE,NULL,"*.bin",NULL,"*.bin"); //TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
{
v_sFileName=dlg.GetPathName(); //读取文件名
TRY
{
v_cRead_file.Open(v_sFileName, CFile::modeRead);
v_iXh++; //图形序号加一
// v_sNum=v_pParent->m_cList.GetItemText(v_iNum,1); //实验编号
// v_sTemp.Format("%02d",v_iXh);
// v_sTemp+=":编号("+v_sNum+");名称("+v_pParent->m_cList.GetItemText(v_iNum,2)+")";
// m_cName.AddString(v_sTemp); //下拉窗口添加数据
v_iDs_time=100; //时间间隔
v_sUnit="mA"; //物理量
//绘制图形
v_iCurveCount++; //绘制图形序号
v_sTemp.Format("%02d_", v_iCurveCount); //曲线名称
v_pCurveCtrl->AddCurve(v_sTemp+v_sFileName, v_sColours[v_iXh % v_iColourCount].crColour);
//增加一条曲线、名称及其显示色彩
//读取文件内的实验数据
v_iSum=0; //数据采集点数
v_cRead_file.Seek(0X0594,CFile::begin); //从文件头开始往下移动0X0594字节,指向数据区
while(true)
{
v_iLen=v_cRead_file.Read(v_bBuffer,1000); //读取数据(每次1000字节)
v_iData=0; //计数器
while(true)
{
if ((v_iData+1)*4<v_iLen) //读完?
{
v_pData=(float*)(v_bBuffer+v_iData*4); //获得一个数据
v_pCurveCtrl->AddData(v_sTemp+v_sFileName, (float)v_iSum, (*v_pData)*1000);
//增加图形数据
v_iData++; //计数器
v_iSum++; //采集点数
}
else
break;
}
if(v_iLen<1000) //全部读完?
break;
}
v_cRead_file.Close(); //关闭文件
v_iXmax_dot=max(v_iXmax_dot,v_iSum); //绘图采集点数计算
m_sUnit=v_sUnit; //物理量
m_iInput=v_iDs_time; //时间间隔
m_iMax=v_iXmax_dot; //采集点数
//图形绘制参数设置
v_iXmax_page=(int(v_iXmax_dot/10)+1)*10; //全屏显示点数
v_iPage=v_iXmax_page; //全屏显示点数
v_pCurveCtrl->m_fHoriBegin=float(0); //初始化显示X坐标:原点为0
v_pCurveCtrl->m_fHoriEnd=float(v_iPage); //初始化显示X坐标:全屏显示
v_pCurveCtrl->Invalidate(); //图形显示
v_pCurveCtrl->SetVertLabel(m_sUnit); //设置实验物理量
v_pCurveCtrl->SetHoriLabel(theApp.a_sXunit); //设置x轴显示内容
}
CATCH_ALL(e)
{
v_cRead_file.Abort();
THROW_LAST();
}
END_CATCH_ALL
}
}
/*
移动文件指针
file.Seek(100,CFile::begin);///从文件头开始往下移动100字节
file.Seek(-50,CFile::end);///从文件末尾往上移动50字节
file.Seek(-30,CFile::current);///从当前位置往上移动30字节
file.SeekToBegin();///移到文件头
file.SeekToEnd();///移到文件尾
读写文件
读文件:
char buffer[1000];
file.Read(buffer,1000);
写文件:
CString string("这个世界只有偏执狂才能成功");
file.Write(string,8);
关闭文件
file.Close();
*/
//-------------------------------------------------------------------------------------------------
// 结束
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonUp(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -