查看: 110  |  回复: 0
  VB6 回调(CallBack)过程,字程序 updateprogressbar
楼主
发表于 2024年10月21日 22:11

回调(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函数的声明:

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public id_timer As Integer
'用来存放返回的定时器的ID
Const inc_step As Integer = 5
'设置ProgressBar值的增量

Starttimer过程调用SetTimer函数生成定时器,hwnd和nIDEvent送入0表示在回调过程中不使用它们,uElapse置为100,让程序每100毫秒就调用一次回调函数;lpTimerFunc参数由AddressOfTimerProc将TimerProc的地址送入函数。

Public Sub starttimer()
    id_timer = SetTimer(0, 0, 100, AddressOf TimerProc)
    Form1.ProgressBar1.Value = 0
    Form1.Command1.Caption = "Stop"
End Sub

'Endtimer清除定时器,同时给用户一个信息反馈。
Public Sub endtimer()
    KillTimer 0, id_timer
    id_timer = 0
    MsgBox "Timer has been killed!", vbExclamation, "Done!"
    Form1.Command1.Caption = "Start"
End Sub

'Updateprogressbar过程用来更新进程条的显示?
Public Sub updateprogressbar()
    Dim percentdone As Integer
    percentdone = Form1.ProgressBar1.Value + inc_step
    If percentdone > 100 Then
        Form1.ProgressBar1.Value = 100
        endtimer
    Else
        Form1.ProgressBar1.Value = percentdone
    End If
End Sub

'建立回调过程,这里回调过程只是调用updateprogressbar过程来更新显示。
Public Sub TimerProc()
    updateprogressbar
End Sub
Private Sub Command1_Click()
    If id_timer > 0 Then
        endtimer
    Else
        starttimer
    End If
End Sub

保存并测试该应用程序,Start钮激活定时器,系统开始周期性地调用回调函数,定时器被连续激活(进程条不断更新),到100或按Stop后定时器被清除,显示终止。

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2024 MaNongKu.com