开发一个波形曲线显示程序.docx
- 文档编号:4370008
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:544.38KB
开发一个波形曲线显示程序.docx
《开发一个波形曲线显示程序.docx》由会员分享,可在线阅读,更多相关《开发一个波形曲线显示程序.docx(15页珍藏版)》请在冰豆网上搜索。
开发一个波形曲线显示程序
开发一个波形显示程序
1.开发目标及软件功能
开发一个波形显示程序,要求采用基于对话框模式的应用程序,能够将一个正弦波形以静态和动态两种模式显示出来,同时波形曲线的参数能够进行调节。
(1)了解图片控件(Picture)和滑动条⑸ider)等控件的编程方法。
(2)了解内存绘图和屏幕显示的一般方法。
2.编程步骤
1.启动VisualC++6.0>选择File|new菜单项,弹出N亡w对话框。
单击Projects选项卡,项目类型选择MFCAppWizard(exe),在Projectname中填入工程名“Wave”,在Location中填用户子目录路径。
2.在程序向导的第1步选择建立一个基于对话框(Dialogbased)的应用程序,点击“Finish”结束向导。
3.删除对话框上原有的“OK”、"Cancel"按钮和静态文本控件,把对话框的尺寸拖人。
在对话框中右键点击,弹出属性设置对话框(DialogProperties),标题(caption)中填入“数据波形显示程序”。
4.
将左侧工作区切换到ResoiuceView,在DialogJt右键点击,选择44InsertDialog插入一个对话框资源,这个对话框将来作为波形曲线的显示窗11。
在对话框上右键点击,弹出属性对话框,设定其ID号为LDD_WAVE_DISPLAY,设定其标题Caption为“波形显示”。
然后在对话框上添加控件如下图所示,为每一个控件指定ED号。
控件类型
ID
Caption
其它
Picture
IDC.COORD
Radio
IDCLEVEL1
0.25V
选中group属性
Radio
IDCLEVEL2
0.5V
Radio
IDCLEVEL3
1.0V
Radio
IDCLEVEL4
2.0V
Radio
IDCTIME1
0.5
选中group属性
Radio
IDCTIME2
1
Radio
IDCTIME3
2
Radio
IDCTIME4
4
Slider
IDCSLIDERH
Slider
IDC_SLIDER_V
属性“Styles”中,方向选为“Vertical”
Button
IDCBTNSTATIC
静态波形
5.为对话框添加一个类:
在对话框的空白区域处双击鼠标,弹岀ClassWizaid窗1丨,在添加一个新类对话框中点击OK按钮,将新类命名为CWaveDisplay,其余选择默认值,点击OK按钮确定。
6.为对话框中的控件添加相应的成员变量:
点击菜单“Vhw-^ClassWizardv,点击MemberVariables"标签项,为对话框中的控件添加对应的成员变量如下图所示。
即在CWaveDisplay类中定义了四个与控件对应的成员变量:
CSlidei-Ctrlm_chuizhi;
CSlidei-Ctrlm_shuipmg;
intnvtiine;
intmjevelsel;
7.
在资源视图(Resourceview)中在“Waveresources”右键选择插入一个“Menu"菜单,双击打开菜单资源IDR.MENU1,添加顶层菜单项“波形显示”,并设置ID号为LDM_WAVE_DISPLAY。
同理添加顶层菜单项“波形显示”,设置ED号为LDM_PARA_SET。
8•点击菜单“View〜ClassWizaicT为菜单项命令添加消息映射函数。
在Classname中选择“CWaveDlg”类,目标LD号中选择“IDM_WWE_DISPLAY”,在“Messages”中选择“Command”,双击,弹出“添加成员函数”对话框,点击“OK”,确认函数名为OnWaveDisplay在此函数中定义CWaveDisplay类的对彖并调用显示对话框,代码如下:
voidCWaveDlg:
:
OnWaveDisplayQ
{
//TODO:
Addyouicoimnandhandlercodehere
CWaveDisplaydig;
dlg.DoModalQ;
}
9.在主程序对话框(EDD_WAVE_DIALOG)中打开属性设置,在Menu属性中选择EDR_MENU1,使得在主程序窗口中能够显示创建的菜单。
在WaveDlg.cpp前面加上CWaveDisplay类的头文件:
#mclude"Wav亡Display.h”
此时编译运行,可以从菜单项中调出波形显示对话框。
10.波形显示时,需在CWaveDisplay类中定义计算和显示波形的一系列相关的成员变量:
在左侧Classview标签中找到CWaveDisplay类,右键点击,在弹出的菜单中选择加入成员变量AddMemberValuables,在弹出对话框中输入变量类型和变量名,点击OK确定,则在
CWaveDisplay中添加了一个公有型的成员变量。
定义各成员变量如下:
public:
CDCmeniDC;〃定义用于内存绘图的设备对象
CDC*pDC;//定义画图设备类的指针
floatmJCount[1024];//定义数据点的数组
intm_High;
//坐标区域的最人值
intm_Low;intm_now;intm_cycctl;intm_count;intiTemp:
//坐标区域的最小值
//坐标的当前值
//判断周期信号与静态信号的开关变量
//用于计数切换静态或周期信号的按钮被点击了几次
//用于储存坐标区域大小度量的中间变量
10.初始化前面定义的成员变量:
在CWaveDisplay类的构造函数中更改及添加初始化代码:
CWaveDisplay:
:
CWaveDisplav(CWild*pPaient/*=NULL*/)
:
CDialog(CWaveDisplay:
:
IDD,pParent)
//{{AFX_DATA.INIT(CWaveDisplav)mjevelsel=0;
m_time=0;
m_count=0;m_cvcctl=l;
//}}AFX_DATA_INIT
}
11.接下来定义成员函数。
点击菜单“View-ClassWizaid”为''静态波形”按钮命令添加消息映射函数。
在Classname中选择“CWaveDisplay”类,目标ID号中选择“LDC_ETN_STATIC”,点击“AddFunction添加消息映射函数OliBtnStatic,用于在静态波形和动态周期波形见进行切换。
其次,在“Messages”中选择“WM_INITDIALOG”,双击,添加OnlnkDuilog成员函数,用于初始化对话框:
选择WM_TIMER”,双击,添加OnTuner成员函数,用于设置定时器。
此外,还需定义一个绘制波形曲线的函数,右键在CwaveDisplay类标签上点击,选择加入成员函数,输入函数类型void,函数名DrawWave(CDC*pDC),OK添加函数。
12.在OnhntDialog函数中添加如下代码:
BOOLCWaveDisplay:
:
OiiInitDialog()
CDialog:
:
OiiInitDialogQ;
//TODO:
Addextrainitializationhere
m_Low=0;
m__High=1024;
m_now=0;
memset(m_lCount,0,1024);〃用来对一段内存空间全部设置为某个字符,一般用来初始化数组或字符串,此处全部置0
m_cliuizlii.SetPos(50);〃滑动条默认取值范I制为0-100,此处取中值
m_shuipmg.SetPos(O);
SetTimer(l,100,NULL);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
13.在OnTimw函数中添加如下代码:
voidCWaveDisplav:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CRectrect;〃定义矩形类对象
CWnd*pWnd=GetDlgItem(IDC_COORD);//获取绘制波形曲线的picture控件的窗口指针
pWnd->GetClientRect(&rect);〃获得pictuie窗I1的矩形区域人小
pDC=pWnd->GetDC();//得到设备指针
〃内存绘图
CBitniapmeniBitmap;
CBitniap*pOldBmp=NULL;
meniDC.CreateCompatibleDC(pDC);〃创建一个与屏幕显示兼容的内存显示设备上下文环境(DC)
meniBitmap.CieateCompatibleBitniap(pDC,iect.iight-rect.leftject.bottom-iect.top);//创建一个与屏幕显示兼容的位图
pOldBmp=meniDC.SelectObject(&m亡mBitmap);//将位图选入到内存显示设备中DrawWave(&meniDC);〃调用画曲线函数
pDC>EitElt(0,Oject・WidthO,Tect・Height(),&memDC,0,0,SRCCOPY);〃从原设备(内存)中复制位图到目标设备(屏幕picture窗口)
meniDC.SelectObject(pOldBnip);//恢复原来位图
meniDC.DeleteDC();〃删除内存中的设备对彖
meniBitmap.DeleteObject();//删除内存中的位图对彖
CDialog:
:
OnTimei(iiIDEvent);
}
14.在DrawWave函数中添加如卜代码:
voidCWaveDisplav:
:
DrawWave(CDC*pDC)
{
UpdateData(TRUE);//得到用户输入的窗门参数,用于重新绘图
CRectrect;//定义矩形类对彖,用于图形窗口
doublepi=3.14159;
mti;〃定义用于循坏计数的变量
〃对不同选择档进行重新赋值,再按照数值进行波形显示
floatlevelsel.tiine;〃定义纵坐标和横坐标变量switch(m.levelsel)
{
case0:
levelsel=4;
break;
case1:
levelsel=2;
break;
case2:
levelsel=l;
break;
case3:
levelsel=0.5;
break;
default:
break;
}
switch(m.time)
{
case0:
time=0.5;
break;
case1:
time=l;
break;
case2:
time=2;
break;
case3:
time=4;
break;
default:
break;
}
〃获取垂直和水平滑动条的位置取值,转换后赋给新的画图变量
mtm^sliderctiLnWochange;
m_sliderctrl=m_chuizlu.GetPos();m_tochange=(m_sliderctrl-50);intm.slishui;
m_slishui=m_shuiping.GetPos()*3;
//获取绘制坐标的文本框
CWnd*pWnd=GetDlgItem(IDC_COORD);//获取绘制波形曲线的pictuie控件的
窗口指针
pWnd->GetClientRect(&rect);〃获得pictuie窗I1的矩形区域人小
pDC->Rectangle(&rect);〃窗II区域绘制一个矩形,用于波形曲线显示〃设置坐标轴的位置
intmjeftjivtopaivnghtaivbottom;
m_left=rect.left+20;
m_top=rect.top+10;
m_nght=rect.right-20;
m_bottom=rect.bottom-20;
iTemp=(m_bottom-m_top)/10;
//创建红色画笔对象
CPen*pPeiiRed=newCPen;
pPeiiRed->CreatePen(PS_SOLID,1,RGE(255Q0));
//创建蓝色画笔对象
CPen*pPeiiBlue=newCPen;
pPeiiBlue->CieatePen(PS_SOLID.1.RGE(0Q255));
//创建黑色画笔对象
CPen*pPenblack=newCPen;
pPenblack->CreatePen(PS_DOT.1,RGE(0Q0));
//选中当前红色画笔,并保存以前的画笔
CGdiObject*pOldPen=pDC->SelectObject(pPeiiRed);
//绘制坐标轴
pDC->MoveTo(m_leftjn.bottom-10*iTemp);
〃垂直轴
pDC->LmeTo(m_leftaii_bottom);
//水平轴
pDC->LmeTo(m_left+20*20,m_bottom);
//绘制X轴刻度
CStrings;s・Fomiat(”%dJO);pDC->TextOut(m_leftjn_bottom+2?
s);for(i=20;i pDC->MoveTo(m_left+i4ii_bottom);pDC->LineTo(m_left+i,m_bottom-10*iTenip);CStrings; s・FomiatC%cT,i/20); pDC->TextOut(m_left-ri,m_bottom-r2,s); } 〃绘制Y轴刻度for(i=1;i<=10;i++) pDC->MoveTo(m_leftjn_bottom-i*iTemp);pDC->LineTo(m_left+440,m_bottom-i*iTemp);CStrings; s.Format(H%dM,i);pDC->TextOut(m_left-17,m_bottom-i*iTemp,s); } 〃判断是否为周期信号或静态信号 if(l=m_count%2) { m_cycctl=0; 〃设置按钮显示文字 〃设置按钮显示文字 S战DlgItemText(IDCJBTN_STATIC「动态波形”);}else { m_cycctl=l;SetDlgItemText(IDC_ETN_STATIC,”静态波形”); } 〃周期循环 if(1=m_cycctl&&m_now<1024) { m_now++; } if(m_now>=1024) { m_.now=0; } 〃模拟正弦波信号 for(i=m_Low;i { m_lCount[i]=siii((pi/20)*i+m_now); } //更改成蓝色画笔绘图pDC->SelectObject(pPeiiBlue);floatxTemp; floatyTemp; floatxSave; floatySave; for(i=m_Low;i xTemp=(m_left+(float)Vtime+m_slishui); yTemp=(m.bottom-5*iTemp-rm_tochange)-m_lCount[i]*iTenip*levelsel;if(i=l) xSave=xTenip; ySave=yTemp; } if(vTemp<=(m_bottom-1O*iTenip)) yTemp=m_bottom-10*iTemp; if(vTemp>m_bottom) yTenip=m_bottom; if((xTemp>=十0・0001+m_slishui))&&(xT亡mp<=(m_left+440))) { pDC->MoveTo(xSave,ySave); pDC->LmeTo(xTemp.yTemp); xSave=xTenip; ySave=yTemp; } } pDC->SelectObject(pOldPen); deletepPenRed; deletepPenBlue; deletepPenblack; return; } 15.在OiiBtnStatic函数中添加如下代码: voidCWaveDisplav: : OnBtnStatic() { //TODO: Addyourcontrolnotificationhandlercodehere m_count++; } 16.编译连接运行。 3.运行界面 4.思考 1•增加其他波形曲线显示(方波信号、随机信号等)。 2.增加对波形的其他操作,比如显示最人值、最小值,取均值,滤波等功能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 开发 一个 波形 曲线 显示 程序