Я попытался сделать анимированную заливку заливки (алгоритм scanline), используя сон в vb. Таким образом, будет отображаться порядок окрашивания пикселей. Она будет работать на немного, но тогда он будет возвращать объект в настоящее время используется в другихСоздание анимации заливки заливки в объект возврата vb в настоящее время используется в другом месте, используя thread.sleep
Это мой код
Sub AnimatedRFRecursive(ByVal P As Point, ByVal C0 As Color, ByVal C1 As Color)
Dim i, xL, xR As Integer
Dim a As Point
i = P.X
While (i >= 0 AndAlso BMP.GetPixel(i, P.Y) = C0)
Thread.Sleep(10)
BMP.SetPixel(i, P.Y, C1)
PictureBox1.Invoke(New Action(Sub() PictureBox1.Image = BMP))
i -= 1
End While
xL = i + 1
i = P.X + 1
While (i < 500 AndAlso BMP.GetPixel(i, P.Y) = C0)
Thread.Sleep(10)
BMP.SetPixel(i, P.Y, C1)
PictureBox1.Invoke(New Action(Sub() PictureBox1.Image = BMP))
End While
xR = i - 1
For i = xL To xR
If (P.Y < 349 AndAlso BMP.GetPixel(i, P.Y + 1) = C0) Then
a.X = i
a.Y = P.Y + 1
AnimatedRFRecursive(a, C0, C1)
End If
If (P.Y > 0 AndAlso BMP.GetPixel(i, P.Y - 1) = C0) Then
a.X = i
a.Y = P.Y - 1
AnimatedRFRecursive(a, C0, C1)
End If
Next
End Sub
Это, как я это называю
Dim thr As New Threading.Thread(Sub() AnimatedRFRecursive(point, C, Color))
thr.Start()
Пожалуйста, скажите мне, где сделал Я ошибаюсь или у вас есть другой метод, который работает. Спасибо
Получаете ошибку, если вы закомментируете строки Picture1.Invoke? – ChicagoMike
Я этого не делал. Но заполнение картинки не отображается – NatJ
У вас мало пользы для этого кода. Он терпит неудачу, поскольку к Bitmap можно получить доступ только по одному потоку за раз. Второй поток, который обращается к нему, представляет собой поток пользовательского интерфейса, происходит, когда содержимое PictureBox необходимо перекрасить. Довольно случайный, но, скорее всего, произойдет. Обычно вы использовали ключевое слово * lock *, чтобы это не происходило, но вы не можете вставить этот оператор в код PictureBox. Вы должны сделать свой собственный. Просто не используйте нить, это совсем не помогает. Вместо этого используйте таймер. –