用VB实现数字波形显示程序
2008-04-09 04:44:13来源:互联网 阅读 ()
关键词:数字;波形;显示 ;滤波
1 前言:
随着计算机技术及电子技术的发展,数字采集技术在检测领域的应用越来越广泛,检测速度越来越高,检测的数据量越来越大,特别是在无损检测领域,将检测数据通过计算机处理后绘制出波形,并实时显示,对及时发现伤损、分析伤损具有重要意义。
2 波形显示
检测数据通常是离散的数据,将离散的数据绘制出波形,可通过在两点间连接线段的方法实现。
2.1 用Line方法显示波形
VB提供了Line画直线方法,可在窗体上增加一个图片框控件,适当设置图片的大小和背景颜色,用Line方法将离散数据按检测顺序连接成线段,即可将波形显示在图片框中。但该方法显示波形速度较慢,不适合高速显示的应用。
2.2 Windows API函数显示波形
在VB中两点间连线的另一种方法是用Windows API函数,Win32 API提供了以下两个函数,联合使用可实现波形的快速显示,经过测试,显示速度比使用Line方法快70%以上。
LineTo函数:
函数功能:画出由数组定义的点连接的一系列线段。
函数原型:BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);
参数:
hdc:设备环境句柄。
nXEnd:定义线段终点的X坐标。
nYEnd:定义线段终点的Y坐标。
返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。
MoveToEx函数:
函数功能:将当前位置更新为指定的点,并有选择的返回原先的位置。
函数原型:BOOL MoveToEx (HDC hdc,int X,int Y,LPPOINT lpPoint);
参数:
hdc:设备环境句柄。
X:定义新位置的X坐标(逻辑坐标)。
Y:定义新位置的Y坐标(逻辑坐标)。
lpPoint:指向一个POINT结构,结构中存放原先的位置。若此参数为NULL,则不返回原先的位置
返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。
在连接线段时,首先将检测数据放入一个数组中,用MoveToEx函数定位画线的起始点坐标,然后用LineTo函数画出起始点至下一个点之间的线段,再用MoveToEx将画线的起始点定位到下一个点,继续用LineTo函数画线,如此循环,即可将离散点连接成波形。
例:
zz = MoveToEx(Picture1.hdc, i, Mwave(i ), LpPoint1)
zz = LineTo(Picture1.hdc, i, Mwave(i 1))
其中:Picture1是显示波形的图片框。
Mwave是存储检测波形的数组。
LpPoint1可按如下方式定义为自定义类型,用于返回起始点坐标。
Type POINTAPI
X As Long
Y As Long
End Type
Public LpPoint1 As POINTAPI
2.3 在VB中声明Windows API函数
用Windows API函数可以实现波形的快速显示,但在使用Windows API函数之前,需在VB中对要使用的API函数用Declare语句声明。声明形式主要有两种:如果该API有返回值,应将其声明为Function函数;如果该API没有返回值,可将其声明为Sub函数。声明形式如下:
Declare Function apiname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type][,[ByVal] variable [as type]]…])] as Type;
Declare Sub apiname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type][,[ByVal] variable [as type]]…])];
其中:Function和Sub用来指定要调用的DLL API函数类型,Lib用来指明DLL文件的路径。如果要调用的API函数使用字符串,必须用Alias指定正确的字符集:ANSI或Unicode;ByVal用于指明参数的传递为值传递,不加ByVal为地址传递;variable 为变量名称;type为变量类型。
在函数的声明和应用时,变量个数应和函数原型相同,类型一致,一一对应。
下面给出了LineTo和MoveToEx两个DLL API函数声明的实例,使用时将以下语句放到标准模块的通用声明部分,即可在程序的任何地方调用。
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long
如果只想在单一模块中调用DLL API,可将Declare前面的Public改成Private,同时将该声明语句放到调用该函数模块的通用声明部分。
经过声明之后的Windows API函数,VB可以象使用自身函数一样来使用。
以上介绍了单幅波形显示的方法,在实际使用时一般需要连续显示波形,连续显示波形时,在显示下一幅波形之前,首先需要对上一幅波形清除或消隐。
VB的图片框和窗体提供了CLS方法,可以实现波形的清除,但在连续显示和清除波形时,存在严重的闪烁现象。
将显示波形的图片框或窗体的DrawMode 属性在属性框中设置成13 - Copy Pen,或在程序中用类似Picture1.DrawMode = vbXorPen 的语句将画笔设置成异或笔,显示波形后经过二次重画即可消隐已经显示的波形。整幅显示-整幅消隐波形一样可出现一定的闪烁,但通过消隐一条线段-显示一条新线段的方法可彻底消除闪烁问题。
该方法对波形显示区中的文字或其他控件均不会造成影响。
4 事件监测
VB是面向对象的程序设计语言,连续显示波形一般需要使用循环语句。在循环显示波形时,通常不能通过波形条件或循环内的条件退出循环,而是需要通过事件驱动退出循环。VB提供了Doevents函数,该函数的功能是转让控制权,以便让操作系统处理其它的事件,可利用该函数实现循环控制中的事件监测。在外部事件中给出退出循环的条件,并在循环中判断该条件,以便在条件成立时退出循环,实现波形的连续显示和退出控制。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash