心电信号模拟采集目录1.实验目的.......................................32.实验内容.......................................33.功能描述.......................................34.实验步骤.......................................34.1创建对话框....................................34.2.编辑对话框...................................54.2.1参数设置......................................54.2.2曲线显示......................................84.2.3打印........................................115.总结与感悟...................................141.实验目的使用MFC进行编程,并掌握编程的技巧。2.实验内容用MFC向导创建一个对话框应用程序,实现参数的保存、显示曲线图以及打印等功能。使用C++语言实现使用VS2010集成开发环境开发使用MFC应用程序开发框架3.功能描述首先确定放大器的参数、数据卡采集频率设置:放大倍数选择50,100,200,500,1000,2000,5000.高通截止频率选择:0.01,0.05,0.1,0.5,1,5,10,30,100Hz。低通截止频率选择:10,30,100,200,500,1000Hz。数据卡采集频率设置:100,200,500,1000,2000,5000,10000byte/s。设置好后,将设计好后的数据保存到某个文件中。缺乏数据采集卡,拟采用已有心电数据文件,打开并读入,然后在屏幕上显示,并且打印波形,写入到xps文件中。4.实验步骤基本功能描述打开exe文件,在参数设置一栏中,选择所需要的参数,然后点击保存,即会弹出窗口选择所要保存得位置。点击显示图形按钮,就会在图形上把数据读进去,并显示曲线图。点击打印按钮,即进入打印的的界面,开始打印曲线图。设计思路1.对需要用到的变量进行初始化,并对控件添加变量,设置变量值。2.选择相应的按钮之后就响应相应的消息处理函数,实现相对应的功能。软件设计4.1创建对话框创建一个MFCAppWizard[exe]工程,命名为“PrintDemo”,如图1所示,并创建对话框,如图2所示。创建成功后,系统自动生成的对话框,如图3所示。图1图2图34.2.编辑对话框在对话框中添加4个ComboBox控件,7个StaticText,3个Button控件,1个tchart控件,并把对话框的Caption改为“心电信号模拟采集软件”。界面如图4下:图44.2.1参数设置在参数设置中,添加控件GroupBox,并设置标题为参数设置,即把放大器倍数、高通滤波器频率、低通滤波器频率、数据采集卡频率放到控件GroupBox中,这样会给人感觉比较规整。设置好之后,在ComboBox的属性Data中添加所要设置的参数,各个数字之间以“;”隔开,属性如图5所示,这样在控件中将会按行排序。修改各个控件的ID号,并对其添加变量,如图6所示,在程序初始化中,我把各个参数的第一个参数设置为默认参数,这样在运行时,就直接出现第一个参数,其产生的效果如图7所示。在参数保存中,我选择的保存方式是.txt文档的形式,为了让保存的数据更加清晰明了,我在每一个数据之前都添加了一个注释。也就是说保存之后,可以使客户一眼就能看出代表的什么意思,如图8所示。图5图6图7图8为了是实现上述的运行之后显示第一个参数,在初始化函数中,添加的程序为:((CComboBox*)GetDlgItem(IDC_HighFilter_COMBO))-SetCurSel(0);((CComboBox*)GetDlgItem(IDC_Amplifier_COMBO))-SetCurSel(0);((CComboBox*)GetDlgItem(IDC_Data_COMBO))-SetCurSel(0);((CComboBox*)GetDlgItem(IDC_LowFilter_COMBO))-SetCurSel(0);在参数保存按钮中,添加的程序为:CFileDialogFileDlg(false,.txt,,OFN_CREATEPROMPT,文本文件(*.txt)|*.txt);if(IDOK==FileDlg.DoModal()){CStringstrName=FileDlg.GetPathName();GetDlgItem(IDC_Amplifier_COMBO)-GetWindowText(m_comboamplifier);GetDlgItem(IDC_HighFilter_COMBO)-GetWindowText(m_combohighfilter);GetDlgItem(IDC_LowFilter_COMBO)-GetWindowText(m_combolowfilter);GetDlgItem(IDC_Data_COMBO)-GetWindowText(m_combodata);CStringstrEdit=m_comboamplifier;CStringstrEdit1=m_combohighfilter;CStringstrEdit2=m_combolowfilter;CStringstrEdit3=m_combodata;FILE*pflOut;pflOut=fopen(strName,wb);if(pflOut==NULL){MessageBox(_T(文件创建失败));}fputs(放大器参数:+strEdit+,pflOut);//写¡ä文?件t内¨²容¨Y。¡êfputs(高通滤波器参数:+strEdit1+,pflOut);fputs(低通滤波器参数:+strEdit2+,pflOut);fputs(数据采集频率:+strEdit3+,pflOut);fclose(pflOut);//关?闭À?文?件t指?针?。¡êAfxMessageBox(_T(参数保存成功|));}else{;}4.2.2曲线显示在显示曲线图时,我选择的是通过添加控件Teechart5,由于tchart控件功能比较强大,双击控件即可进入修改控件中的参数的界面,点击添加曲线图,选择fastline,并对轴进行修改,添加横轴纵轴标签,如图9所示。还可以自动实现曲线图的放大、缩小,曲线图的形状、视图状态、拖拉、显示数据等功能,并对其进行设置,即把数据传到曲线图中。在这里我将会展示两种曲线图,分别如图10,11所示。图10是显示部分数据,这里的曲线图比较直观,可以很快的观察到曲线图的变化。图11显示的曲线图是把所有的数据都传了进去,并且横轴坐标时间是以秒计算的。图12是曲线图放大部分,图13是显示的曲线图下移部分。图9图10图11图12图13显示曲线图部分的代码程序如下所示:ifstreamifs(samples.txt);CStringstrLine(_T());stringstrText();LPCTSTRszToken(_T());intcurPos=0;intnIndex=0;vectorNodemyNodeList;intnCount=0;while(getline(ifs,strText)){curPos=0;strLine.Trim(_T());nIndex=0;if(strText.compare()!=0){stringstr1=strText.substr(2,2);stringstr2=strText.substr(5,3);stringstr3=strText.substr(10);chartime[10];itoa(atoi(str1.c_str())*1000+atoi(str2.c_str()),time,10);strings_time(time);Nodetemp(strtod(s_time.c_str(),NULL),atof(str3.c_str()));myNodeList.push_back(temp);}nCount++;}CSeriessertDemo=(CSeries)m_tchart.Series(0);sertDemo.Clear();for(inti=0;inCount;i++){sertDemo.AddXY(myNodeList[i].GetTime(),myNodeList[i].GetVolt(),NULL,NULL);}4.2.3打印打印部分,添加打印预览窗口,并设置相对应的变量,代码如下所示:LRESULTCPrintDemoDlg::OnPrintWindow(WPARAMwParam,LPARAMlParam){CRectrectWnd;BITMAPbmGraphy;CBitmapbitmapTemp,*pOldBmpGraphy;CDC*pGraphyDC=newCDC;CDC*pDC=GetDC();CDC*pPrintDC=(CDC*)wParam;CPrintInfo*pInfo=(CPrintInfo*)lParam;m_bitmapPrint.GetBitmap(&bmGraphy);pGraphyDC-CreateCompatibleDC(pDC);pOldBmpGraphy=pGraphyDC-SelectObject(&m_bitmapPrint);pPrintDC-StretchBlt(pInfo-m_rectDraw.left,pInfo-m_rectDraw.top,pInfo-m_rectDraw.Width(),pInfo-m_rectDraw.Height(),pGraphyDC,0,0,bmGraphy.bmWidth,bmGraphy.bmHeight,SRCCOPY);pGraphyDC-SelectObject(pOldBmpGraphy);ReleaseDC(pGraphyDC);deletepGraphyDC;return1;}添加获取窗口曲线函数,获得窗口位图。程序如下所示:voidCPrintDemoDlg::GetWindowGraph(){CRectrectWnd;CBitmap*pOldBitmap;CDC*pDC=GetDC();CDC*pMemDC=newCDC;GetWindowRect(rectWnd);m_bitmapPrint.DeleteObject();m_bitmapPrint.CreateCompatibleBitmap(pDC,rectWnd.Width(),rectWnd.Height());pMemDC-CreateCompatibleDC(pDC);pOldBitmap=pMemDC-SelectObject(&m_bitmapPrint);PrintWindow(pMemDC,0);pMemDC-SelectObject(pOldBitmap);ReleaseDC(pMemDC);deletepMemDC;}添加C++头文件PrintFrame.cpp,以及在类CPrintFrame中添加函数名为DoPrintView,OnDestroy,DoPrint。在DoPrintView函数的程序为:voidCPrintFrame::DoPrintView(){if(m_pPrintView!=NULL){m_pPrintView-ShowWindow(SW_SHOW);SetActiveView(m_pPrintView);}SetIcon(m_pMainDlg-GetIcon(FALSE),FALSE);Se