Hi!
Inspiriert durch diesen Thread, hier ein Beispiel für den flüssigen Übergang von einer Farbe in eine andere.
Anwendung: neues Modul erstellen (Modul deshalb, weil Extension-Methods verwendet werden. Diese benötigen ein Modul.)
Modulcode durch den oberen Code ersetzen. Die Anwendung der Funktionen siehe unteres Beispiel.
Keine Garantie auf volle Funktionsfähigkeit. Der Code darf frei verwendet und verändert werden. Namensnennung nicht notwendig.
LG, der_Kurt
Inspiriert durch diesen Thread, hier ein Beispiel für den flüssigen Übergang von einer Farbe in eine andere.
VB.NET-Quellcode
- Module farbe
- 'Event, der gefeuert wird, wenn der Vorgang beendet ist
- Public Event finishedcoloring(sender As System.Object)
- Public Enum enArt
- ForeColor
- BackColor
- End Enum
- <Runtime.CompilerServices.Extension()>
- Sub setForeGroundColor(l As Control, newcolor As Color)
- setColor(l, newcolor, enArt.ForeColor)
- End Sub
- <Runtime.CompilerServices.Extension()>
- Sub setBackGroundColor(l As Control, newcolor As Color)
- setColor(l, newcolor, enArt.BackColor)
- End Sub
- Private Sub setColor(l As Control, newcolor As Color, Art As enArt)
- 'wir machen das Ganze in einem Thread.
- '...Schließlich wollen wir, dass die Form auch noch reagiert
- Dim thr As New Threading.Thread(
- Sub()
- 'Die zu verändernde Farbe merken
- Dim Startfarbe As Color = If(Art = enArt.ForeColor,
- l.ForeColor,
- l.BackColor)
- 'R-, G-, B-Wert der aktuell angezeigten Farbe
- Dim r, g, b As Integer
- 'Die Richtungen, in die die Farbe geändert wird.
- 'Wenn beide Farben gleich sind, bleibt die Variable auf 0
- Dim dir_r, dir_g, dir_b As Integer
- If Startfarbe.R > newcolor.R Then
- dir_r = -1
- ElseIf Startfarbe.R < newcolor.R Then
- dir_r = 1
- End If
- If Startfarbe.G > newcolor.G Then
- dir_g = -1
- ElseIf Startfarbe.G < newcolor.G Then
- dir_g = 1
- End If
- If Startfarbe.B > newcolor.B Then
- dir_b = -1
- ElseIf Startfarbe.B < newcolor.B Then
- dir_b = 1
- End If
- r = Startfarbe.R
- g = Startfarbe.G
- b = Startfarbe.B
- Do
- 'Berechnung des nächsten Farbschrittes
- If dir_r <> 0 Then r = r + dir_r
- If dir_g <> 0 Then g = g + dir_g
- If dir_b <> 0 Then b = b + dir_b
- 'wenn der aktuelle Farbwert den Zielwert erreicht hat, dann
- 'die Richtungs-Variable auf 0
- If r = newcolor.R Then dir_r = 0
- If g = newcolor.G Then dir_g = 0
- If b = newcolor.B Then dir_b = 0
- 'Farbe verändern
- l.FindForm.BeginInvoke(Sub()
- If Art = enArt.ForeColor Then
- l.ForeColor = Color.FromArgb(r, g, b)
- Else
- l.BackColor = Color.FromArgb(r, g, b)
- End If
- End Sub)
- If dir_r = 0 AndAlso
- dir_g = 0 AndAlso
- dir_b = 0 Then Exit Do
- 'Um den Effekt etwas sichtbarer zu machen...
- Threading.Thread.Sleep(1)
- Loop
- 'Event abfeuern, falls man informiert werden will,
- '...dass der Vorgang fertig ist
- RaiseEvent finishedcoloring(l)
- End Sub)
- 'Als BG-Thread definieren.
- 'Sonst läuft der Thread weiter, wenn die Form geschlossen ist...
- '... Zugriff auf Steuerelement, ... >> exception
- thr.IsBackground = True
- 'Los geht's
- thr.Start()
- 'TODO: Event, wenn die Form frühzeitig geschlossen wird.
- 'License: "Do whatever you want, but don't blame me"
- '######## Der Code darf frei verwendet, verändert werden
- '######## Namensnennung nicht notwendig
- End Sub
- End Module
Anwendung: neues Modul erstellen (Modul deshalb, weil Extension-Methods verwendet werden. Diese benötigen ein Modul.)
Modulcode durch den oberen Code ersetzen. Die Anwendung der Funktionen siehe unteres Beispiel.
Keine Garantie auf volle Funktionsfähigkeit. Der Code darf frei verwendet und verändert werden. Namensnennung nicht notwendig.
LG, der_Kurt