开发一个波形曲线显示程序
LabVIEW中的曲线图

LabVIEW中的曲线图LabVIEW的曲线图与波形图控件不同之处在于:波形图可以交互的实时绘出数据曲线;而曲线图则是一次性绘出预先生成的数据数组,曲线图没有向已有数据追加新数据的能力。
在LabVIEW中有多种曲线图控件的类型,这大大提高了曲线图控件的灵活性,这些类型包括了波形曲线图、XY曲线图、密度曲线图、3D曲线图、数字信号波形曲线图以及一些特殊类型的曲线图。
在本文里面我们主要讲一下波形和XY曲线图。
波形曲线图以及XY曲线图控件在VI程序的前面板中的外观是一样的,不过其功能却是完全不同的。
一个有多个曲线的曲线图控件如下图所示:这两种类型的曲线图控件可以在Controls控件面板的Modern>>Graph子面板中找到。
波形曲线图空间只能用来绘制单值曲线(就是说对每个X值只对应一个Y值),并且这些值所对应的X轴的间距都是一致的,例如由固定采样间隔采集到的波形数据曲线。
这个控件最适合绘制数据点均匀分布的数组数据。
XY曲线图控件则是通用的、基于笛卡尔坐标系的曲线图控件,可以用来绘制变时基或者一个X值对应多个Y值的数据曲线。
这两种曲线图控件看起来一样,不过它们的输入数据类型是不同的,这一点要非常注意才是。
单曲线波形曲线图对于简单的单点曲线图,你可以如下图所示将一个Y值的数组直接连接到波形曲线图控件的输入端点上。
在这种模式下,默认X的初始值为0,并且X值的增量为1。
你可以看到在下图中,程序框图中曲线图控件的输入端点是一个数组指示控件。
如前面所讲到的数组的介绍,上图中的For循环中的输出就是一个一维的数组。
有些时候,为了灵活起见,你可能需要修改曲线图的时基。
例如,你在进行数据采集的起始时间并不是0,或者是你的数据采样间隔并不是1个标准单位(可能大或者小于一个标准单位)。
这是要修改时基的话,就将X0起始值、ΔX 值以及数据数组绑定到一个簇中,之后再将这个簇连接到曲线图。
如下图所示,可以看到曲线图控件的输入端已经变成簇指示器的模样了。
Labview实验二、For循环和波形图的使用

实验二、For循环和波形图的使用一、实验目的(1)熟悉LabVIEW中Fir循环的使用以及图形与图表的数据显示。
(2)熟悉如何在一个波形图控件中创建多条曲线,同时显示曲线数据以及将其保存至指定的路径和格式文件中。
二、实验内容(1)创建一个VI程序,程序中需要使用一个For循环以及一个波形图控件与波形图表控件。
此VI要实现的功能是:利用For循环生成100个随机数,并将这100个随机数分别在波形图控件和波形图表控件中显示,并比较波形图控件和波形图表控件在数据显示上的区别。
(2)创建一个VI程序。
此VI要实现的功能是:使用一个For循环并执行100次循环,在循环中将产生100个随机数,同时使用一个正弦函数来生成正弦波形,正弦波形的周期通过数值函数来调整。
通过For循环生成的两条曲线的数据通过创建数组函数转换成一个二维数组,用户使用一个数值显示控件和波形图控件来分别显示两条曲线的数据和波形。
最后使用文件写入函数将曲线数据写至一个电子表格文件中。
三、实验步骤练习三:(1)新建一个VI,并在前面板中添加一个波形图控件和一个波形图表控件,如图。
(2)切换至程序框图窗口,创建一个空的For循环并将循环总数设置为50。
(3)添加一个随机数函数放入For循环中,设置常量为100.(4)完成程序框图的连线。
如图:(5)运行程序并进行观察。
练习四:(1)新建一个VI,并添加一个波形图控件。
(2)在前面板中添加一个显示二维数组中元素的数值显示控件。
(3)将鼠标移至数组左侧带有上、下箭头的元素的下边框处,按住鼠标左键,并向下拖动至出现两个元素,将一维数组改为二维数组。
前面板如图:(4)切换至程序框图中,在程序框图中放置一个For循环,并设置循环总数为100.(5)在For循环中放置一个随机数函数,2个乘法函数和1个除法函数,一个正弦函数。
(6)创建一个数组函数并拖放至程序框图中合适的位置。
(7)添加一个电子表格文件函数,转置端子属性设置为是。
虚拟仪器上机实验五 图形与图表实验

上机实验五、图形与图表实验一、实验目的1、掌握波形图和波形图表控件的特点和使用方法;2、掌握公式节点的基本使用方法;3、学习XY图的使用方法。
二、实验仪器设备1、计算机;2、LabVIEW软件环境。
三、实验内容和实现分析(一)实验内容1、单曲线波形的显示设计一个VI,分别用波形图和波形图表控件显示y=x2+2x+1的图形,其中x取值为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15。
观察显示过程。
2、多曲线波形的显示设计一个VI,分别用波形图和波形图表控件显示二函数:y=x2+2x+1,y1=50ln(x+1)的图形,其中x取值为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15。
观察显示过程。
3、李萨茹图形的显示利用XY图控件显示李萨茹图形,输入信号为具有一定相位差的正弦波,改变相位差值,观察李萨茹图形的变化情况。
(二)实现分析1、单曲线波形的显示(1)前面板设计1)启动LabVIEW,在启动界面,点击选择“新建VI”选项。
新建一空白VI。
2)从打开的控件选板中选择“新式”→“图形”子选板,从中分别选取一个“波形图”控件和一个波形图表控件,放置在前面板上合适位置。
然后再创建一个一维数组控件,将数组元素初始值设置为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15。
设置波形图控件和波形图表控件的外观颜色,例如一个为红色,一个为蓝色。
设置完成的前面板如下图所示。
(2)后面板设计切换到程序框图窗口,从函数选板中选择一个For循环图框,放置到后面板上,For循环结构位于函数选板的“编程”→“结构”子选板,然后在For循环图框内放入一个等待函数节点以及一个公式节点,等待函数的等待时间设置为1s。
在公式节点内建立公式,然后按照所需完成的功能进行连线。
设计完成的后面板见下图所示。
切换到前面板窗口,单击“运行”按钮,运行该VI。
观察波形显示过程。
基于C#的波形显示控件的实现[附完整源码下载]
![基于C#的波形显示控件的实现[附完整源码下载]](https://img.taocdn.com/s3/m/439a85c7aa00b52acfc7ca50.png)
编者记:09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的数据进行处理和保存,并以图形的方式显示),整个项目边学C# WinForm边设计,这个波形显示控件就是项目中的一部分,也花了自己绝大多数时间。
暑假一结束,也就没有再去接触C#了,主要精力放在C++,Windows 编程上去了。
此外,顺便将该波形显示控件当作自己毕业设计的内容,下文实际上是节选自自己的本科毕业论文的呵呵,希望对大家能有所帮助。
由于自己是个C#新手,所以代码以及文章有疏漏、错误、不妥之处在所难免,欢迎交流哈(现在看着十个月前写的代码,感想颇多......)欢迎转载,但请注明出处(通宵整理排版= = 很不容易的哈)/xf_z1988/archive/2010/05/11/CSharp_WinForm_Wavef orm.html(写这篇文章之时,大学再一个半月就结束了,目前在学C++、Windows编程、希望能找到个适合的工作吧)“基于C#的波形显示控件”设计于09年暑假源代码奉上呵呵:博客园下载| CSDN下载解压密码:CSharp_WinForm_Waveform《基于C#的波形显示控件的实现》写于2009年9月跳到文章目录(注意这里是采用锚链接,订阅的朋友可能访问会失效的,例如QQ邮箱中的订阅= = 还是访问原文吧)“基于C#的波形显示控件的演示程序”为配套控件使用而设计的(演示程序源代码同控件源代码一起奉上了)下面先上几张图,大家可以先了解最后做出来是个什么东西:再奉上两个波形显示控件的演示视频(两个视频内容差不多的呵呵):摘要计算机技术的飞速发展使得其在自动化系统中的应用日益增强。
大量监控、图像数据显示软件活跃在自动化工业及自动化教学领域。
同时,软件系统的日益复杂化使得模块化开发变得尤为重要。
本课题所设计的基于C#的波形显示控件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。
《虚拟仪器与LabVIEW程序设计》章节思考与练习题含答案(大学期末复习资料)

第1章虚拟仪器概述1.测试测量仪器发展至今经过了那些阶段?答:经历了4个阶段,即:第一代模拟式仪器(或指针式仪器)、第二代数字式仪器、第三代智能仪器、第四代虚拟仪器。
2.什么是虚拟仪器,它有哪些特点?答:虚拟仪器是指在以计算机为核心的硬件平台上,其功能由用户设计和定义,具有虚拟仪器面板,其测试功能由测试软件实现的一种计算机仪器系统。
特点:虚拟含义主要有两点:1、仪器面板是虚拟的,通过调用控件选板中的控件实现3.简述虚拟仪器的系统组成?答:虚拟仪器系统由硬件平台和软件平台两大部分完成:硬件平台:计算机、I/O接口设备;软件平台:4.简述虚拟仪器的软件层次结构?答:测试管理层:用户及仪器设备等管理。
应用程序开发层:用户根据仪器功能需求开发设计的虚拟仪器程序。
仪器驱动层:完成对特定仪器的控制和通信的程序集合。
I/O总线驱动层:完成对仪器寄存器进行直接存储数据操作,并为仪器设备与仪器驱动程序提供信息传递的底层软件。
第2章一个简单VI的设计1.输入两个数,求两个数的和差运算,并显示结果。
2.程序运行中,用旋钮控件改变图形曲线的颜色。
建立波形图表的属性节点,改为可写,并指定为曲线Plot的颜色Color属性。
第3章几种常用的程序结构1.创建一个VI产生100个随机数,求其最小值和平均值。
2.创建一个VI,每秒显示一个0到1之间的随机数。
同时,计算并显示产生的最后四个随机数的平均值。
只有产生4个数以后才显示平均值,否则显示0。
每次随机数大于0.5时,使用Beep.vi产生蜂鸣声。
3.求X的立方和(使用For和While循环)。
4.编程求1000内的“完数”。
“完数”指一个数恰好等于它本身的因子之和。
例如28=14+7+4+2+1。
5.创建一个VI ,实现加、减、乘、除四种运算方式。
6.编写一个程序测试输入以下字符所用的时间:LabVIEW is a graphical programming language.7.使用公式节点创建VI ,完成下面公式计算,并将结果显示在同一个屏幕上。
威伦触摸屏曲线图显示波形

威伦触摸屏曲线图显示波形一、实验前基本知识了解。
1、HMI内存地址LW,范围LW0~LW11300,为16位寄存器,存储32数据时,地址偏移量+2。
例如:以LW0为首地址存放一个浮点型的数,那么该浮点数存放位置为LW0-LW1,我们在操作时,只需要设置该数据的类型,系统会自动读取和写入。
2、西门子1200PLC DB数据块数据的读取。
数值元件读取写入添加一个数值元件,打开属性。
设备:选择添加好的PLC。
地址:选择DBDn,30000。
30000中的3表示数据块DB3,后面的0000表示数据块DB3中的偏移地址。
那么则我们选择的是读取变量“采集温度”。
需要注意的是数据块要取消优化访问功能才能进行偏移量显示。
威伦触摸屏幕中的地址格式可以通过在地址栏中任意输入字符点确定即可查看地址填写规则。
3、HMI宏指令。
GetData:取值指令。
格式:GetData(读取数据存放的变量, “读取数据的设备名称”, 数据名, 读取的数据首地址, 读取数据个数)。
说明:读取的数据可以来自HMI,也可以来自PLC,主要看对应参数的设置,读取的数据类型取决于数据存放变量的类型。
例:float in_1[201]GetData(in_1[200], "Siemens S7-1200/S7-1500", DBDn, 30004, 1)将PLC "Siemens S7-1200/S7-1500"中的DB3.DBD4开始读取1个数据把它存放在数组in_1[200]中。
SetData:赋值指令。
格式:SetData(要赋值的变量, “被赋值的设备名称”, 被赋值的数据名, 被赋值的首地址, 赋值的个数)。
例:float in_1[201]in_1[200]=3.14GetData(in_1[200], "Siemens S7-1200/S7-1500", DBDn, 30004, 1)将3.14的值赋给PLC "Siemens S7-1200/S7-1500"中DB3数据块中偏移量为4首地址中,被赋值数据的个数为1.4、宏指令设置。
达芬奇 调色曲线 波形调节

达芬奇调色曲线波形调节全文共四篇示例,供读者参考第一篇示例:达芬奇调色曲线是一种非常强大的调色工具,可以帮助视频制作人员对影片进行精细的调色调节,以达到更加理想的视觉效果。
通过调整曲线的参数,可以对图像的亮度、对比度、色彩等方面进行精准的控制,从而使影片呈现出更加专业、精致的画面效果。
在达芬奇调色软件中,调色曲线是一个非常重要的模块,用来控制影片的亮度和对比度。
通过调整曲线的形状,可以改变影片的整体亮度和对比度,从而使画面看起来更加生动、清晰。
调色曲线还可以用来调节影片的色彩,例如增加或减少某种颜色的饱和度,使影片色彩更加丰富多彩。
除了基本的明度调整外,达芬奇调色曲线还有很多高级的功能,比如色调曲线、灰度曲线、RGB曲线等。
通过这些曲线的调节,可以对影片进行更加细致精确的调色调节,使影片的色彩更加准确和饱满。
在达芬奇调色软件中,波形调节是一个非常实用的功能,可以帮助用户对影片的亮度和色彩进行更加精确的调节。
通过波形调节,用户可以清楚地看到影片中每一个像素点的亮度和色彩情况,从而可以有针对性地对其进行调整,使画面更加清晰、生动。
达芬奇调色曲线和波形调节是影片调色中非常重要的两个工具,可以帮助用户对影片进行精细、专业的调色调节,使画面效果更加出色。
通过熟练掌握这两个工具的使用方法,用户可以轻松地达到自己所需的画面效果,从而提高影片的质量和观赏性。
【2000字】第二篇示例:达芬奇调色曲线波形调节达芬奇是一款专业的视频调色软件,被广泛应用于影视后期制作中。
在达芬奇软件中,调色曲线和波形调节是两大重要功能,能够帮助编辑人员完成对视频素材的精细调色和色彩修正。
本文将详细介绍达芬奇软件中的调色曲线和波形调节功能,帮助读者更好地了解和掌握这两项关键的调色技术。
一、调色曲线调色曲线是达芬奇软件中用于调整色彩亮度和对比度的重要工具。
通过调色曲线,用户可以精确地控制不同亮度范围下的色彩表现,实现对图像整体和局部的调节。
LabWindows_CVI采集卡编程说明

7.
定时器程序
在定时器程序中被调用 //开关量采集命令 void ReadDI(void) { char DiStr[50]; unsigned char Str1[3]; int i; i=Rbh_DI(2,&DIValue[0]);//从驱动程序得到开关量采集结果 //显示开关量采集结果,用十六进制方式表示,每个字节的 8 位,每位代表一个开关量 状态 sprintf (DiStr, "Byte0= %02x, Byte1=%02x", DIValue[0],DIValue[1]); SetCtrlVal (panelhandle, PANEL_DISTR, DiStr); }
//定义采集的参数 int NumBuf;//采集的通道数 int NumSamp; int BegChn; int NumChn; int FrqSamp; int FrqFilter; int AmpGain; //下面的参数从驱动程序中读出 char ADCard_Name[100]; //采集卡名称 int Maxchn; //最大通道数 int LowFreq; //最低的采样频率 int HighFreq; //最高的采样频率 int MinSampNum; //最少的每包采样点数 float VZero; //AD 转换结果的零点 AD 值 float VMax; //AD 转换结果的最大 AD 值 int MaxBinChn; //最大二进制开关量个数
6.
定时器程序
定时器程序是高速连续采集的关键程序,在本程序中显示三个功能: z 高速、连续模拟量采集与曲线显示、数字显示功能; z 开关量采集与现实功能 z 采集状态信号灯控制功能 //定时器功能 int CVICALLBACK TIMER_AD (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int i; switch (event) { case EVENT_TIMER_TICK: if(!FlagStartAD)return 0; //如果定时器没有启动就退出 i=ReadADResult(); //采集模拟量 ReadDI(); //开关量采集 //下面控制 LED 灯,当启动采集时,该状态灯一亮一灭 if(swTimer==0){ swTimer=1; //亮灭标志置 1 SetCtrlVal(panel, PANEL_LED_AD, 0);//标志灯亮 }else { swTimer=0;//亮灭标志清零 SetCtrlVal(panel, PANEL_LED_AD, 1);//标志灯灭 } break; } return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开发一个波形显示程序一. 开发目标及软件功能开发一个波形显示程序,要求采用基于对话框模式的应用程序,能够将一个正弦波形以静态和动态两种模式显示出来,同时波形曲线的参数能够进行调节。
(1)了解图片控件(Picture)和滑动条(Slider)等控件的编程方法。
(2)了解内存绘图和屏幕显示的一般方法。
二. 编程步骤1. 启动Visual C++6.0,选择File | new 菜单项,弹出New 对话框。
单击Projects 选项卡,项目类型选择MFC AppWizard(exe),在Project name中填入工程名“Wave”,在Location中填用户子目录路径。
2. 在程序向导的第1步选择建立一个基于对话框(Dialog based)的应用程序,点击“Finish”结束向导。
3. 删除对话框上原有的“OK”、“Cancel”按钮和静态文本控件,把对话框的尺寸拖大。
在对话框中右键点击,弹出属性设置对话框(Dialog Properties),标题(caption)中填入“数据波形显示程序”。
4. 将左侧工作区切换到ResourceView,在Dialog上右键点击,选择“Insert Dialog”,插入一个对话框资源,这个对话框将来作为波形曲线的显示窗口。
在对话框上右键点击,弹出属性对话框,设定其ID号为IDD_W A VE_DISPLAY,设定其标题Caption为“波形显示”。
然后在对话框上添加控件如下图所示,为每一个控件指定ID号。
控件类型ID号Caption 其它Picture IDC_COORDRadio IDC_LEVEL1 0.25V选中group属性Radio IDC_LEVEL2 0.5VRadio IDC_LEVEL3 1.0VRadio IDC_LEVEL4 2.0VRadio IDC_TIME1 0.5选中group属性Radio IDC_TIME2 1Radio IDC_TIME3 2Radio IDC_TIME4 4Slider IDC_SLIDER_HSlider IDC_SLIDER_V 属性“Styles”中,方向选为“Vertical”Button IDC_BTN_STA TIC 静态波形5. 为对话框添加一个类:在对话框的空白区域处双击鼠标,弹出ClassWizard窗口,在添加一个新类对话框中点击OK按钮,将新类命名为CWaveDisplay,其余选择默认值,点击OK 按钮确定。
6. 为对话框中的控件添加相应的成员变量:点击菜单“View →ClassWizard”,点击“Member Variables”标签项,为对话框中的控件添加对应的成员变量如下图所示。
即在CWaveDisplay类中定义了四个与控件对应的成员变量:CSliderCtrl m_chuizhi;CSliderCtrl m_shuiping;int m_time;int m_levelsel;7. 在资源视图(ResourceView)中在“Wave resources”右键选择插入一个“Menu”菜单,双击打开菜单资源IDR_MENU1,添加顶层菜单项“波形显示”,并设置ID号为IDM_WA VE_DISPLAY。
同理添加顶层菜单项“波形显示”,设置ID号为IDM_PARA_SET。
8. 点击菜单“View →ClassWizard”为菜单项命令添加消息映射函数。
在Class name中选择“CWaveDlg”类,目标ID号中选择“IDM_W A VE_DISPLAY”,在“Messages”中选择“Command”,双击,弹出“添加成员函数”对话框,点击“OK”,确认函数名为“OnWaveDisplay”。
在此函数中定义CWaveDisplay类的对象并调用显示对话框,代码如下:void CWaveDlg::OnWaveDisplay(){// TODO: Add your command handler code hereCWaveDisplay dlg;dlg.DoModal();}9. 在主程序对话框(IDD_W A VE_DIALOG)中打开属性设置,在Menu属性中选择IDR_MENU1,使得在主程序窗口中能够显示创建的菜单。
在WaveDlg.cpp前面加上CWaveDisplay类的头文件:#include "WaveDisplay.h"此时编译运行,可以从菜单项中调出波形显示对话框。
10. 波形显示时,需在CWaveDisplay类中定义计算和显示波形的一系列相关的成员变量:在左侧Classview标签中找到CWaveDisplay类,右键点击,在弹出的菜单中选择加入成员变量Add Member Variables,在弹出对话框中输入变量类型和变量名,点击OK确定,则在CWaveDisplay中添加了一个公有型的成员变量。
定义各成员变量如下:public:CDC memDC; //定义用于内存绘图的设备对象CDC* pDC; // 定义画图设备类的指针float m_lCount[1024]; // 定义数据点的数组int m_High; // 坐标区域的最大值int m_Low; // 坐标区域的最小值int m_now; // 坐标的当前值int m_cycctl; // 判断周期信号与静态信号的开关变量int m_count; // 用于计数切换静态或周期信号的按钮被点击了几次int iTemp; // 用于储存坐标区域大小度量的中间变量10. 初始化前面定义的成员变量:在CWaveDisplay类的构造函数中更改及添加初始化代码:CWaveDisplay::CWaveDisplay(CWnd* pParent /*=NULL*/): CDialog(CWaveDisplay::IDD, pParent){//{{AFX_DATA_INIT(CWaveDisplay)m_levelsel = 0;m_time = 0;m_count=0;m_cycctl=1;//}}AFX_DATA_INIT}11. 接下来定义成员函数。
点击菜单“View →ClassWizard”为“静态波形”按钮命令添加消息映射函数。
在Class name中选择“CWaveDisplay”类,目标ID号中选择“IDC_BTN_STATIC”,点击“Add Function”,添加消息映射函数OnBtnStatic,用于在静态波形和动态周期波形见进行切换。
其次,在“Messages”中选择“WM_INITDIALOG”,双击,添加OnInitDialog成员函数,用于初始化对话框;选择WM_TIMER”,双击,添加OnTimer 成员函数,用于设置定时器。
此外,还需定义一个绘制波形曲线的函数,右键在CwaveDisplay 类标签上点击,选择加入成员函数,输入函数类型void,函数名DrawWave(CDC *pDC),OK添加函数。
12. 在OnInitDialog函数中添加如下代码:BOOL CWaveDisplay::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization herem_Low = 0;m_High = 1024;m_now =0;memset(m_lCount,0,1024); //用来对一段内存空间全部设置为某个字符,一般用来初始化数组或字符串,此处全部置0m_chuizhi.SetPos(50); //滑动条默认取值范围为0-100,此处取中值m_shuiping.SetPos(0);SetTimer(1,100,NULL);return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }13. 在OnTimer函数中添加如下代码:void CWaveDisplay::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCRect rect; //定义矩形类对象CWnd* pWnd = GetDlgItem(IDC_COORD); // 获取绘制波形曲线的picture控件的窗口指针pWnd->GetClientRect(&rect); //获得picture窗口的矩形区域大小pDC = pWnd->GetDC(); // 得到设备指针//内存绘图CBitmap memBitmap;CBitmap* pOldBmp = NULL;memDC.CreateCompatibleDC(pDC); //创建一个与屏幕显示兼容的内存显示设备上下文环境(DC)memBitmap.CreateCompatibleBitmap(pDC,rect.right-rect.left,rect.bottom-rect.top); //创建一个与屏幕显示兼容的位图pOldBmp = memDC.SelectObject(&memBitmap); // 将位图选入到内存显示设备中DrawWave(&memDC); //调用画曲线函数pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY); //从原设备(内存)中复制位图到目标设备(屏幕picture窗口)memDC.SelectObject(pOldBmp); //恢复原来位图memDC.DeleteDC(); //删除内存中的设备对象memBitmap.DeleteObject(); // 删除内存中的位图对象CDialog::OnTimer(nIDEvent);}14. 在DrawWave函数中添加如下代码:void CWaveDisplay::DrawWave(CDC *pDC){UpdateData(TRUE); // 得到用户输入的窗口参数,用于重新绘图CRect rect; // 定义矩形类对象,用于图形窗口double pi=3.14159;int i; //定义用于循环计数的变量//对不同选择档进行重新赋值,再按照数值进行波形显示float levelsel,time; //定义纵坐标和横坐标变量switch (m_levelsel){case 0:levelsel=4;break;case 1:levelsel=2;break;case 2:levelsel=1;break;case 3:levelsel=0.5;break;default:break;}switch (m_time){case 0:time=0.5;break;case 1:time=1;break;case 2:time=2;break;case 3:time=4;break;default:break;}//获取垂直和水平滑动条的位置取值,转换后赋给新的画图变量int m_sliderctrl,m_tochange;m_sliderctrl=m_chuizhi.GetPos();m_tochange=(m_sliderctrl-50);int m_slishui;m_slishui=m_shuiping.GetPos()*3;// 获取绘制坐标的文本框CWnd* pWnd = GetDlgItem(IDC_COORD); //获取绘制波形曲线的picture控件的窗口指针pWnd->GetClientRect(&rect); //获得picture窗口的矩形区域大小pDC->Rectangle(&rect); //窗口区域绘制一个矩形,用于波形曲线显示//设置坐标轴的位置int m_left,m_top,m_right,m_bottom;m_left = rect.left+20;m_top = rect.top+10;m_right = rect.right-20;m_bottom = rect.bottom-20;iTemp = (m_bottom - m_top)/10;// 创建红色画笔对象CPen* pPenRed = new CPen;pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));// 创建蓝色画笔对象CPen* pPenBlue = new CPen;pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));// 创建黑色画笔对象CPen* pPenblack = new CPen;pPenblack->CreatePen(PS_DOT,1,RGB(0,0,0));// 选中当前红色画笔,并保存以前的画笔CGdiObject* pOldPen = pDC->SelectObject(pPenRed);// 绘制坐标轴pDC->MoveTo(m_left,m_bottom-10*iTemp);// 垂直轴pDC->LineTo(m_left,m_bottom);// 水平轴pDC->LineTo(m_left+20*20,m_bottom);// 绘制X轴刻度CString s;s.Format("%d",0);pDC->TextOut(m_left,m_bottom+2,s);for (i =20; i < m_right-20; i+=20){pDC->MoveTo(m_left+i,m_bottom);pDC->LineTo(m_left+i,m_bottom-10*iTemp);CString s;s.Format("%d",i/20);pDC->TextOut(m_left+i,m_bottom+2,s);}//绘制Y轴刻度for (i = 1 ;i <= 10 ;i++){pDC->MoveTo(m_left,m_bottom - i*iTemp);pDC->LineTo(m_left+440,m_bottom - i*iTemp);CString s;s.Format("%d",i);pDC->TextOut(m_left-17,m_bottom - i*iTemp,s);}//判断是否为周期信号或静态信号if (1==m_count%2){m_cycctl=0;SetDlgItemText(IDC_BTN_STATIC,"动态波形"); //设置按钮显示文字}else{m_cycctl=1;SetDlgItemText(IDC_BTN_STATIC,"静态波形"); //设置按钮显示文字}//周期循环if (1==m_cycctl&&m_now<1024){m_now++;}if(m_now>=1024){m_now=0;}//模拟正弦波信号for (i = m_Low; i<m_High; i++){m_lCount[i] = sin((pi/20)*i+m_now);}// 更改成蓝色画笔绘图pDC->SelectObject(pPenBlue);float xTemp;float yTemp;float xSave;float ySave;for (i = m_Low; i <m_High; i++){xTemp = (m_left+(float)i/time+m_slishui);yTemp = (m_bottom - 5*iTemp+m_tochange)-m_lCount[i]*iTemp*levelsel;if (i == 1){xSave=xTemp;ySave=yTemp;}if (yTemp <= (m_bottom-10*iTemp))yTemp = m_bottom-10*iTemp;if (yTemp > m_bottom)yTemp = m_bottom;if ((xTemp >= (m_left+0.0001+m_slishui)) && (xTemp <= (m_left+440))){pDC->MoveTo(xSave,ySave );pDC->LineTo(xTemp, yTemp);xSave=xTemp;ySave=yTemp;}}pDC->SelectObject(pOldPen);delete pPenRed;delete pPenBlue;delete pPenblack;return;}15. 在OnBtnStatic函数中添加如下代码:void CWaveDisplay::OnBtnStatic(){// TODO: Add your control notification handler code herem_count++;}16. 编译连接运行。