计算机程序设计数字示波器程序的设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(7)对每路信号,可独立进行放大显示,在水平和垂直方向上移动。
4.2
(1)可在指定位置输入文字,自定义文字的字体、大小和颜色;
(2)其它自行设计的功能。
(1)动态调整信号的频率,并且能在调整后立即执行,能看到调整效果;
(2)通过旋钮设定参数值;
(3)进行组件值限定,控制参数的设置范围;
(4)可弹出独立窗口放大显示主窗口中信号的局部内容;
(4)视图类
从CView中派生出来,是程序的用户界面,用于显示、打印存储在文档类对象中的数据,并管理与用户的交互,其重要成员函数有GetDocument函数和OnDraw函数。GetDocument()函数的返回值是指向与当前视图相关联的文档对象的指针,因而通过它可以访问文档类对象中的公有私有成员。OnDraw函数用于实现输出,一般来说,窗口中的内容都是OnDraw函数输出的。
(2)设定信号线条的类型、粗细、颜色;
(3)显示正弦波,方波,锯齿波;
(4)显示2-4路信号,各信号独立显示,每路信号单独配置参数,并能保存配置的参数,软件重新运行时,参数不丢失,能够默认为最后一次设置的参数;
(5)每路信号的显示可以独立开关,也可以统一开关所有信号;
(6)每路信号只显示在对应的窗口,每个窗口只显示一路信号;
(2)窗口框架类
从CMainWnd派生提供了一个SDI窗口的所有功能,如显示一个标题、一个菜单栏、一个工具栏等。所有SDI应用程序窗口框架类名都是CMainFrame,但是性质是有区别的。
(3)文档类
从CDocument类派生出来,是应用程序进行数据定义和初始化的地方。文档类的数据成员只有被说明成公有成员才能被视图类中的成员函数访问,其重要成员函数是OnNewDocument(),是进行数据成员初始化的地方。程序开始时会自动调用该函数。
SDI应用程序由AppWizard创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。SDI应用程序框架主要包含以下几个类:
(1)应用程序类
每个应用程序类必须从CWinApp派生出自己的应用程序类,该类封装了包括初始化、运行和结束的整个过程,其名称是AppWizard根据工程名称自动命名的。如果工程名符合标识符的命名规则,则应用程序类名一般由字母C、工程名和App三部分组成。文档类和视图类的命名规则与应用程序类类似,区别在于在后面分别添加了Doc和View。
如图2所示为主窗体界面,在此界面可以添加各种控件以及调整布局。左边为三个波形显示通道,右边在相应的位置上加上对应的控件用于进行不同的功能控制。
图2: MFC主窗体
运行程序,将弹出如图3所示的示波器主界面。
图3: 示波器主界面
(1)显示模块设计
如图3的左半部分。首先获取用户区域,然后用画刷进行填充绘制,绘制背景面板;然后确定曲线面板区域,绘制网格,作为绘制动态曲线区域;确定标注数值变化的面板区域;确定标题栏区域,绘制标题。
使用ClassWizard添加并且编写消息处理函数。
(2)对话框应用程序框架
用AppWizard创建基于对话框的应用程序框架后,项目工作区上将出现“ResourceView”选项卡和“ClassView”选项卡,很多工作是需要通过这两个选项卡进行的。在VisualC++中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_TEST_DIALOG的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。比如创建的应用程序名为“TEST”,则在ClassView中,有三个重要的类:CAboutDlg、CTESTApp和CTESTDlg。CAboutDlg类对应了生成的版本信息对话框;CTESTDlg是对话框类,从Cdialog继承过来的,在程序运行时看到的对话框就是它的一个具体对象;CTESTApp是应用程序类,从CWinApp继承过来,封装了初始化、运行、终止该程序的代码。
CScope类中封装的操作包括绘制波形,更新波形,在横轴和纵轴方向上放大或缩小波形和实现波形的移动。
绘制波形:将波形的值与此时的时间分别存入CScope类中的两个链表中,绘图时,将时间与值分别赋给POINT的横坐标和纵坐标;再使用CDC类的Polyline()函数将点与点之间用曲线连接,如图4所示。
长安大学电子与控制工程学院
《计算机程序设计综合实验》
综合实验指导书
数字示波器程序的设计
1.实验目的与要求
通过该实验,使学生掌握面向对象程序设计的基本理论以及视窗程序的基本设计方法,其中包括需求分析、总体设计、详细设计、代码编写及调试等设计环节。要求学生掌握示波器的功能和操作方法,熟练应用时钟、图形绘制功能、文件的读写以及文件内容的检索方法,达到既定的设计效果。
SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3
对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在VisualC++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。
(1)创建对话框应用程序的基本步骤:
建立基于对话框的MFC应用程序框架;
在程序用户界面上放置控件;
设置控件属性;
使用ClassWizard为控件连接变量,即为控件命名;
(3)对话框设计工具
通过对话框设计工具,可以获得所见即所得的效果。通过将控件工具栏上的标准控件按钮,可以在对话框上绘制出所需要的程序界面效果。当然,也可以采用代码的方式动态的创建或隐藏控件。另外,可以添加OLE第三方控件,丰富对话框的交互功能。
3
文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。由于本课程的实验并不涉及多文档程序结构,所以MDI不做介绍。
Invalidate(FALSE)//窗口原有的内容保留,再进行绘制。
InvalidateRect(矩形,TRUE)//擦除矩形区域内原有内容,重新绘制这个区域。
Invalidawk.baidu.comeRect(矩形,FALSE)//矩形区域内原有内容保留,再绘制这个区域。
4.实验要求
4.1
(1)设定信号的类型,频率,振幅,和其它相关参数;
需要强调的是OnDraw函数有两种调方法,即自动调用和手工调用。当窗口发生变化视图需要重新绘制时,应用程序会自动调用该函数;当程序中的数据改变了需要重新显示时,可以通过调用Invalidate和InvalidateRect函数,引发对Ondraw函数的间接调用。比如:
Invalidate(TRUE)//擦除窗口原有的内容,重新绘制。
MFC大约有200多个类,可以分成两种:
(1)Cobject类的派生类。它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的Windows实体对应;
(2)非Cobject派生类。这些都是独立的类,如表示点的Cpoint类,表示矩形的Crect类等。
在VisualC++中,可以创建以下3类典型的Windows应用程序,且都是通过MFCAppWizard(以下简称AppWizard)向导创建的:
(1)基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如Windows自带的计算器程序。
(2)单文档界面(SDI)应用程序:这类程序一次只能打开一个文档,如Windows自带的Notepad程序。
(3)多文档界面(MDI)应用程序:这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换。
(5)其它自行设计的功能。
5.设计要点
本综合实验课程鼓励学生的设计创新,所以本节所包含的设计方案或设计方法只作为提示或参考。
5.1
在Visual软件中选择新建项目,选择MFC应用程序并建立新工程。
图1:工程创建
5.2
在资源视图中选择对话框,对要使用的控件进行添加与布局,最终生成的软件界面如图2所示。
2.开发环境及先修课程要求
操作系统:Windows7操作系统(或更高版本)
集成开发环境:VisualStudio2010+MSDN(或更高版本)
先修课程:C/C++程序设计、面向对象程序设计、数据结构与算法
3.Windows编程基础
用VisualC++编写Windows应用程序主要有两种方法:(1)使用Windows提供的应用程序接口(ApplicationProgrammingInterface,API)函数;(2)使用Microsoft提供的微软基础类(MicrosoftFoundationClass,MFC)。在直接使用API函数进行Windows编程时,程序员不仅需要熟记一大堆常用的API函数,而且还要对Windows操作系统有深入的了解,需要编写大量的代码,不适合软件开发的发展潮流,而MFC类库采用面向对象的思想将Windsows应用程序中的API函数做了封装,而且灵活性高,便于程序员的使用。虽然Windows程序设计还有其他的集成开发环境可以使用,但是考虑到前期的教学内容,本实验要求学生采用基于MFC的方法来实现。
波形的移动:在CScope类中添加一个WM_MOUSEMOVE消息映射,当拖动鼠标左键时就会调用该消息映射函数,用户点击示波器右边的游标即可实现拖动波形,如图5所示。
(2)控制模块设计
如图3的右半部分。这些按键分为不同部分,每一个部分都用组合框分开,;添加按钮控件,总开关是控制三个窗口的开关;各个的组合框里边的开关分别控制各自的窗口;然后再在各自的组合框中添加“频率”、“振幅”、“粗细”、“颜色”、“实线”、“虚线”、“点划线”、“正弦波”、“方波”和“锯齿波”等控件,控制波形参数。
PlaySound(_T("C://Users//zjjmh//Desktop//莫名其妙示波器//bad//示波器//shiboqi//haha.wav"), NULL, SND_FILENAME | SND_ASYNC);
}
总停止开关及其他相似。
5.3波形显示模块设计
创建一个CStatic类的子类CScope,生成一个显示波形的静态控件。CStatic类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串,框,矩形,图标,光标,位图,或增强的图元文件。它可以用来作为标签,框,或用来分隔其它的控件。一个静态控件不接收输入,也不提供输出;但是,如果它是用SS_NOTIFY风格创建的,则它可以通知其父有关设备点击的消息。创建一个静态控件分两步。首先,调用构造函数来构造此CStatic对象,然后调用Create成员函数来创建此静态控件并将它与该CStatic对象连接。如果在一个对话框中创建了一个静态控件(通过一个对话框资源),则当用户关闭这个对话框时,此CStatic对象被自动销毁。如果在一个窗口中创建了一个CStatic对象,则必须销毁它。在一个窗口的堆栈中创建的CStatic对象将自动被销毁。如果使用new函数在堆中创建CStatic对象,则当使用完后,必须调用delete来销毁这个CStatic对象。
“开”控件,为其添加的消息映射定时器settimer函数,同时写入几个通道的开启输出波形语句。“关”控件,为其添加的消息映射为几通道关闭输出的语句。主要程序如下:
void CShiboqiDlg::OnStart()//总开始开关
{
CH1=1;
CH2=1;
UpdateData(TRUE);
SetTimer(1,150,NULL);
图4:绘制波形功能
同时,在CMyDlg中使用SetTimer定义一个定时器,每隔设定的时间就会调用OnTimer消息映射函数;在其中定义dTime为开启后的系统时间作为CScope类中使用的时间,并根据不同的波形对波形进行赋值。
在横轴和纵轴方向上放大或缩小波形:在CScope类中添加一个WM_LBUTTONDOWN消息映射,当点击鼠标左键时就会调用该消息映射函数,
4.2
(1)可在指定位置输入文字,自定义文字的字体、大小和颜色;
(2)其它自行设计的功能。
(1)动态调整信号的频率,并且能在调整后立即执行,能看到调整效果;
(2)通过旋钮设定参数值;
(3)进行组件值限定,控制参数的设置范围;
(4)可弹出独立窗口放大显示主窗口中信号的局部内容;
(4)视图类
从CView中派生出来,是程序的用户界面,用于显示、打印存储在文档类对象中的数据,并管理与用户的交互,其重要成员函数有GetDocument函数和OnDraw函数。GetDocument()函数的返回值是指向与当前视图相关联的文档对象的指针,因而通过它可以访问文档类对象中的公有私有成员。OnDraw函数用于实现输出,一般来说,窗口中的内容都是OnDraw函数输出的。
(2)设定信号线条的类型、粗细、颜色;
(3)显示正弦波,方波,锯齿波;
(4)显示2-4路信号,各信号独立显示,每路信号单独配置参数,并能保存配置的参数,软件重新运行时,参数不丢失,能够默认为最后一次设置的参数;
(5)每路信号的显示可以独立开关,也可以统一开关所有信号;
(6)每路信号只显示在对应的窗口,每个窗口只显示一路信号;
(2)窗口框架类
从CMainWnd派生提供了一个SDI窗口的所有功能,如显示一个标题、一个菜单栏、一个工具栏等。所有SDI应用程序窗口框架类名都是CMainFrame,但是性质是有区别的。
(3)文档类
从CDocument类派生出来,是应用程序进行数据定义和初始化的地方。文档类的数据成员只有被说明成公有成员才能被视图类中的成员函数访问,其重要成员函数是OnNewDocument(),是进行数据成员初始化的地方。程序开始时会自动调用该函数。
SDI应用程序由AppWizard创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。SDI应用程序框架主要包含以下几个类:
(1)应用程序类
每个应用程序类必须从CWinApp派生出自己的应用程序类,该类封装了包括初始化、运行和结束的整个过程,其名称是AppWizard根据工程名称自动命名的。如果工程名符合标识符的命名规则,则应用程序类名一般由字母C、工程名和App三部分组成。文档类和视图类的命名规则与应用程序类类似,区别在于在后面分别添加了Doc和View。
如图2所示为主窗体界面,在此界面可以添加各种控件以及调整布局。左边为三个波形显示通道,右边在相应的位置上加上对应的控件用于进行不同的功能控制。
图2: MFC主窗体
运行程序,将弹出如图3所示的示波器主界面。
图3: 示波器主界面
(1)显示模块设计
如图3的左半部分。首先获取用户区域,然后用画刷进行填充绘制,绘制背景面板;然后确定曲线面板区域,绘制网格,作为绘制动态曲线区域;确定标注数值变化的面板区域;确定标题栏区域,绘制标题。
使用ClassWizard添加并且编写消息处理函数。
(2)对话框应用程序框架
用AppWizard创建基于对话框的应用程序框架后,项目工作区上将出现“ResourceView”选项卡和“ClassView”选项卡,很多工作是需要通过这两个选项卡进行的。在VisualC++中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_TEST_DIALOG的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。比如创建的应用程序名为“TEST”,则在ClassView中,有三个重要的类:CAboutDlg、CTESTApp和CTESTDlg。CAboutDlg类对应了生成的版本信息对话框;CTESTDlg是对话框类,从Cdialog继承过来的,在程序运行时看到的对话框就是它的一个具体对象;CTESTApp是应用程序类,从CWinApp继承过来,封装了初始化、运行、终止该程序的代码。
CScope类中封装的操作包括绘制波形,更新波形,在横轴和纵轴方向上放大或缩小波形和实现波形的移动。
绘制波形:将波形的值与此时的时间分别存入CScope类中的两个链表中,绘图时,将时间与值分别赋给POINT的横坐标和纵坐标;再使用CDC类的Polyline()函数将点与点之间用曲线连接,如图4所示。
长安大学电子与控制工程学院
《计算机程序设计综合实验》
综合实验指导书
数字示波器程序的设计
1.实验目的与要求
通过该实验,使学生掌握面向对象程序设计的基本理论以及视窗程序的基本设计方法,其中包括需求分析、总体设计、详细设计、代码编写及调试等设计环节。要求学生掌握示波器的功能和操作方法,熟练应用时钟、图形绘制功能、文件的读写以及文件内容的检索方法,达到既定的设计效果。
SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3
对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在VisualC++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。
(1)创建对话框应用程序的基本步骤:
建立基于对话框的MFC应用程序框架;
在程序用户界面上放置控件;
设置控件属性;
使用ClassWizard为控件连接变量,即为控件命名;
(3)对话框设计工具
通过对话框设计工具,可以获得所见即所得的效果。通过将控件工具栏上的标准控件按钮,可以在对话框上绘制出所需要的程序界面效果。当然,也可以采用代码的方式动态的创建或隐藏控件。另外,可以添加OLE第三方控件,丰富对话框的交互功能。
3
文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。由于本课程的实验并不涉及多文档程序结构,所以MDI不做介绍。
Invalidate(FALSE)//窗口原有的内容保留,再进行绘制。
InvalidateRect(矩形,TRUE)//擦除矩形区域内原有内容,重新绘制这个区域。
Invalidawk.baidu.comeRect(矩形,FALSE)//矩形区域内原有内容保留,再绘制这个区域。
4.实验要求
4.1
(1)设定信号的类型,频率,振幅,和其它相关参数;
需要强调的是OnDraw函数有两种调方法,即自动调用和手工调用。当窗口发生变化视图需要重新绘制时,应用程序会自动调用该函数;当程序中的数据改变了需要重新显示时,可以通过调用Invalidate和InvalidateRect函数,引发对Ondraw函数的间接调用。比如:
Invalidate(TRUE)//擦除窗口原有的内容,重新绘制。
MFC大约有200多个类,可以分成两种:
(1)Cobject类的派生类。它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的Windows实体对应;
(2)非Cobject派生类。这些都是独立的类,如表示点的Cpoint类,表示矩形的Crect类等。
在VisualC++中,可以创建以下3类典型的Windows应用程序,且都是通过MFCAppWizard(以下简称AppWizard)向导创建的:
(1)基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如Windows自带的计算器程序。
(2)单文档界面(SDI)应用程序:这类程序一次只能打开一个文档,如Windows自带的Notepad程序。
(3)多文档界面(MDI)应用程序:这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换。
(5)其它自行设计的功能。
5.设计要点
本综合实验课程鼓励学生的设计创新,所以本节所包含的设计方案或设计方法只作为提示或参考。
5.1
在Visual软件中选择新建项目,选择MFC应用程序并建立新工程。
图1:工程创建
5.2
在资源视图中选择对话框,对要使用的控件进行添加与布局,最终生成的软件界面如图2所示。
2.开发环境及先修课程要求
操作系统:Windows7操作系统(或更高版本)
集成开发环境:VisualStudio2010+MSDN(或更高版本)
先修课程:C/C++程序设计、面向对象程序设计、数据结构与算法
3.Windows编程基础
用VisualC++编写Windows应用程序主要有两种方法:(1)使用Windows提供的应用程序接口(ApplicationProgrammingInterface,API)函数;(2)使用Microsoft提供的微软基础类(MicrosoftFoundationClass,MFC)。在直接使用API函数进行Windows编程时,程序员不仅需要熟记一大堆常用的API函数,而且还要对Windows操作系统有深入的了解,需要编写大量的代码,不适合软件开发的发展潮流,而MFC类库采用面向对象的思想将Windsows应用程序中的API函数做了封装,而且灵活性高,便于程序员的使用。虽然Windows程序设计还有其他的集成开发环境可以使用,但是考虑到前期的教学内容,本实验要求学生采用基于MFC的方法来实现。
波形的移动:在CScope类中添加一个WM_MOUSEMOVE消息映射,当拖动鼠标左键时就会调用该消息映射函数,用户点击示波器右边的游标即可实现拖动波形,如图5所示。
(2)控制模块设计
如图3的右半部分。这些按键分为不同部分,每一个部分都用组合框分开,;添加按钮控件,总开关是控制三个窗口的开关;各个的组合框里边的开关分别控制各自的窗口;然后再在各自的组合框中添加“频率”、“振幅”、“粗细”、“颜色”、“实线”、“虚线”、“点划线”、“正弦波”、“方波”和“锯齿波”等控件,控制波形参数。
PlaySound(_T("C://Users//zjjmh//Desktop//莫名其妙示波器//bad//示波器//shiboqi//haha.wav"), NULL, SND_FILENAME | SND_ASYNC);
}
总停止开关及其他相似。
5.3波形显示模块设计
创建一个CStatic类的子类CScope,生成一个显示波形的静态控件。CStatic类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串,框,矩形,图标,光标,位图,或增强的图元文件。它可以用来作为标签,框,或用来分隔其它的控件。一个静态控件不接收输入,也不提供输出;但是,如果它是用SS_NOTIFY风格创建的,则它可以通知其父有关设备点击的消息。创建一个静态控件分两步。首先,调用构造函数来构造此CStatic对象,然后调用Create成员函数来创建此静态控件并将它与该CStatic对象连接。如果在一个对话框中创建了一个静态控件(通过一个对话框资源),则当用户关闭这个对话框时,此CStatic对象被自动销毁。如果在一个窗口中创建了一个CStatic对象,则必须销毁它。在一个窗口的堆栈中创建的CStatic对象将自动被销毁。如果使用new函数在堆中创建CStatic对象,则当使用完后,必须调用delete来销毁这个CStatic对象。
“开”控件,为其添加的消息映射定时器settimer函数,同时写入几个通道的开启输出波形语句。“关”控件,为其添加的消息映射为几通道关闭输出的语句。主要程序如下:
void CShiboqiDlg::OnStart()//总开始开关
{
CH1=1;
CH2=1;
UpdateData(TRUE);
SetTimer(1,150,NULL);
图4:绘制波形功能
同时,在CMyDlg中使用SetTimer定义一个定时器,每隔设定的时间就会调用OnTimer消息映射函数;在其中定义dTime为开启后的系统时间作为CScope类中使用的时间,并根据不同的波形对波形进行赋值。
在横轴和纵轴方向上放大或缩小波形:在CScope类中添加一个WM_LBUTTONDOWN消息映射,当点击鼠标左键时就会调用该消息映射函数,