用VB實現數字波形顯示程序
|
摘 要:本文詳細介紹了在VB集成環境下數字波形高速顯示的方法,同時對雙通道波形顯示和數字濾波方法也進行了介紹。
關鍵詞:數字;波形;顯示 ;濾波
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可以象使用自身函數一樣來使用。