無私漂 2007-11-22 10:19
如何在VB中使用回調(CallBack)過程
如何在VB中使用回調(CallBack)過程
----回調(CallBack)過程是應用程序內部的、Windows系統可以調用的過程。在windows編程中,回調過程的使用是很普遍的,最明顯的例子是窗口過程本身就是一個回調過程,應用程序窗口對事件的捕獲就是由windows調用相應的窗口過程實現的。用過C編程的人都知道函數名本身就是這個函數的指針,調用它其實就是調用了函數体。但在VB中沒有指針這個概念,如果想在VB中使用回調過程可得費一番周折,幸好在VB5中新增了AddressOf運算符,用它可以得到過程的地址,這樣就大大簡化了在VB中使用回調過程的難度。下面就用一個例子來具体說明如何實現:
----Windows提供了定時器這种輸入設備,它可以周期性地在指定間隔的時間過去時通知應用程序,VB中的Timer控件就是經過封裝的定時器。SetTimer函數用來分配定時器,它有四個參數:hwndAsLong是接收WM_TIMER消息的窗口的句柄;nIDEventAsLong定時器的ID,它是一個非0數;uElapseAsLong是指定的一個時間間隔,以毫秒為單位;lpTimerFuncAsLong定時器函數的過程實例地址,在這里是回調過程的地址。KillTimer函數用來清除定時器:hwndAsLong与定時器相關的窗口;nIDEventAsLong定時器的ID。我們用AddressOf操作符建立回調過程,用來接收定時器的通知,需要注意的是回調過程必須建立在標准模塊中,并且一定要具有正确的語法,由于VB不提供語法檢查,也不對錯誤進行通知,因此在回調過程中使用錯誤的語法將會導致致命的錯誤,而使程序崩潰。
----創建一新的EXE項目,在窗体上放置一ProgressBar和Command控件,添加一模塊,給模塊添加API函數的聲明:
----DeclareFunctionSetTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong,ByValuElapseAsLong,ByVallpTimerFuncAsLong)AsLong
----DeclareFunctionKillTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong)AsLong
Publicid_timerAsInteger
用來存放返回的定時器的ID
Constinc_stepAsInteger=5
設置ProgressBar值的增量
----Starttimer過程調用SetTimer函數生成定時器,hwnd和nIDEvent送入0表示在回調過程中不使用它們,uElapse置為100,讓程序每100毫秒就調用一次回調函數;lpTimerFunc參數由AddressOfTimerProc將TimerProc的地址送入函數。
PublicSubstarttimer()
Id_timer=SetTimer(0,0,100,AddressOftimerproc)
Form1.ProgressBar1.Value=0
Form1.Command1.Caption="Stop"
EndSub
Endtimer清除定時器,同時給用戶一個信息反饋。
PublicSubendtimer()
KillTimer0,id_timer
id_timer=0
MsgBox"Timerhasbeenkilled!",vbExclamation,"Done!"
Form1.Command1.Caption="Start"
EndSub
Updateprogressbar過程用來更新進程條的顯示。
PublicSubupdateprogressbar()
DimpercentdoneAsInteger
percentdone=Form1.ProgressBar1.Value inc_step
Ifpercentdone>100Then
Form1.ProgressBar1.Value=100
endtimer
Else
Form1.ProgressBar1.Value=percentdone
EndIf
EndSub
----建立回調過程,這里回調過程只是調用updateprogressbar過程來更新顯示。
PublicSubTimerProc()
updateprogressbar
EndSub
**SubCommand1_Click()
Ifid_timer>0Then
endtimer
Else
starttimer
EndIf
EndSub
----保存并測試該應用程序,Start鈕激活定時器,系統開始周期性地調用回調函數,定時器被連續激活(進程條不斷更新),到100或按Stop后定時器被清除,顯示終止。以上代碼在VB5專業版,Pwin98操作系統下運行通過。
----何如在VB中使用回調(CallBack)過程