VB.NET 创建进度提示框

公司需要写一个给单片机程序升级的工具, 发送时需要显示当前发送进度信息. 原来我使用的方法是在"升级"按钮的 MouseUp 事件里发送数据以及更新界面. 虽然界面信息会更新,但鼠标点击会无反应,窗口被其他窗体挡住时,鼠标点击也不会置顶,所以想到了写一个提示窗体解决这些问题.

  1. 添加一个窗体,将FormBorderStyle设为None
  2. 拖入一个BackgroundWorker控件
  3. 在窗体内添加一个Panel,Dock设为Fill,BorderStyle设为FixedSingle作为窗体边框
  4. 窗体内添加一个Label用来显示Gif动画,Gif动画可以从 Preloaders.net 下载
  5. Panel内添加一个TableLayoutPanel, TableLayoutPanel内添加一个Label用来显示提示文本

窗体布局

内部事件

Public Class BackgroundWorkDialog
    ''' 
    ''' 后台触发事件
    ''' 
    Public Delegate Sub BackgroundWorkEventHandle(BgWorkDialog As BackgroundWorkDialog)

    Private Event BackgroundWorkEvent As BackgroundWorkEventHandle

    Private BgWorkEventHandle As BackgroundWorkEventHandle

    Private Sub BackgroundWorkDialog_Load(sender As Object, e As EventArgs) Handles Me.Load
        '允许其他线程直接操作控件
        'Control.CheckForIllegalCrossThreadCalls = False

        '自动换行
        MessageLabel.MaximumSize = New Drawing.Size(TableLayoutPanel1.Width, 0)
    End Sub

    Public Overloads Sub ShowDialog(func As BackgroundWorkEventHandle)
        BgWorkEventHandle = func

        AddHandler Me.BackgroundWorkEvent, BgWorkEventHandle
        Me.ShowDialog()
    End Sub

    Private Sub BackgroundWorkDialog_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorkDialog_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        RemoveHandler Me.BackgroundWorkEvent, BgWorkEventHandle
    End Sub

    Private Delegate Sub ShowMsgCallback(Msg As String)
    ''' 
    ''' 更新提示信息
    ''' 
    ''' 
    Public Sub ShowMsg(Msg As String)
        If Me.InvokeRequired Then
            Me.Invoke(New ShowMsgCallback(AddressOf ShowMsg), New Object() {Msg})
            Exit Sub
        End If

        MessageLabel.Text = Msg
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        RaiseEvent BackgroundWorkEvent(Me)
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Me.Close()
    End Sub
End Class

调用方式

在按钮事件里

Using tmpDialog As New BackgroundWorkDialog
    tmpDialog.ShowDialog(AddressOf func)
End Using

同时实现事件func

    Private Sub func(BgWD As BackgroundWorkDialog)
        Dim tmpRandom As New Random

        For i001 = 0 To 100 - 1
            BgWD.ShowMsg($"当前升级文件发送进度: {i001}.{tmpRandom.Next(0, 9)}%")

            'Threading.Thread.Sleep(tmpRandom.Next(0, 500))
            Threading.Thread.Sleep(100)
        Next
    End Sub

运行效果

VB.NET 创建进度提示框_第1张图片

你可能感兴趣的:(.NET)