在Visual Studio 2017中,在Windows窗体应用程序(.NET Framework)中的Visual Basic中工作。
我试图创建一个按钮,其中按钮的背景颜色是渐变的渐变。我做了一个简单的算法来进行渐变变换,并使用时间延迟函数在颜色变化之间等待。但是,颜色在执行时不会在for循环中更新,只显示最终结果,那么如何解决呢?认为它是时间延迟功能的问题,但不确定,无论如何这里是代码:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Public Sub bg_MouseClick(sender As Object, e As MouseEventArgs) Handles bg.MouseClick
Dim r As Integer = 241
Dim g As Integer = 121
Dim b As Integer = 121
For x = g To r
g += 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
For x = b To r
r -= 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
For x = b To g
b += 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
For x = r To g
g -= 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
For x = g To b
r += 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
For x = g To b
b -= 1
bg.BackColor = Color.FromArgb(r, g, b)
timeDelay(0.01)
Next
MessageBox.Show("Finished")
End Sub
Public Sub timeDelay(ByVal secondsDelayedBy As Double)
Dim stopwatch As New Stopwatch
Dim endtimer = False
stopwatch.Start()
Do Until endtimer = True
If stopwatch.ElapsedMilliseconds > (secondsDelayedBy * 1000) Then
endtimer = True
stopwatch.Stop()
End If
Loop
End Sub
End Class
答案 0 :(得分:1)
这很糟糕,因为您的代码在UI线程上运行,并在不刷新界面的情况下锁定它,并且它实际显示任何更新的唯一时间是代码完成运行。
要更新你的按钮颜色,你可以在@TnTinMn上提及他的评论使用a
在for循环中使用bg.Refresh
,或使用异步子并在分离的线程上运行它。
使用bg.Refresh
你的循环将如下所示:
For x = g To r
g += 1
bg.BackColor = Color.FromArgb(r, g, b)
bg.Refresh()
timeDelay(0.01)
Next
使用异步方法:
Public Async Sub bg_MouseClick(sender As Object, e As MouseEventArgs) Handles bg.MouseClick
Dim r As Integer = 241
Dim g As Integer = 121
Dim b As Integer = 121
Await Task.Run(Sub()
For x = g To r
g += 1
SetButtonColor(bg, Color.FromArgb(r, g, b))
timeDelay(0.01)
Next
'Other for Loops...
End Sub)
MessageBox.Show("Finished")
End Sub
Public Sub SetButtonColor(Button As Button, Color As Color)
If Button.InvokeRequired Then
Button.Invoke(Sub() SetButtonColor(Button, Color))
Else
Button.BackColor = Color
End If
End Sub
答案 1 :(得分:-2)
更改所有' timeDelay(0.01)
'致电:Threading.Thread.Sleep(10) : Application.DoEvents()