flüssiger Farbübergang

    • VB.NET

      flüssiger Farbübergang

      Hi!
      Inspiriert durch diesen Thread, hier ein Beispiel für den flüssigen Übergang von einer Farbe in eine andere.

      VB.NET-Quellcode

      1. Module farbe
      2. 'Event, der gefeuert wird, wenn der Vorgang beendet ist
      3. Public Event finishedcoloring(sender As System.Object)
      4. Public Enum enArt
      5. ForeColor
      6. BackColor
      7. End Enum
      8. <Runtime.CompilerServices.Extension()>
      9. Sub setForeGroundColor(l As Control, newcolor As Color)
      10. setColor(l, newcolor, enArt.ForeColor)
      11. End Sub
      12. <Runtime.CompilerServices.Extension()>
      13. Sub setBackGroundColor(l As Control, newcolor As Color)
      14. setColor(l, newcolor, enArt.BackColor)
      15. End Sub
      16. Private Sub setColor(l As Control, newcolor As Color, Art As enArt)
      17. 'wir machen das Ganze in einem Thread.
      18. '...Schließlich wollen wir, dass die Form auch noch reagiert
      19. Dim thr As New Threading.Thread(
      20. Sub()
      21. 'Die zu verändernde Farbe merken
      22. Dim Startfarbe As Color = If(Art = enArt.ForeColor,
      23. l.ForeColor,
      24. l.BackColor)
      25. 'R-, G-, B-Wert der aktuell angezeigten Farbe
      26. Dim r, g, b As Integer
      27. 'Die Richtungen, in die die Farbe geändert wird.
      28. 'Wenn beide Farben gleich sind, bleibt die Variable auf 0
      29. Dim dir_r, dir_g, dir_b As Integer
      30. If Startfarbe.R > newcolor.R Then
      31. dir_r = -1
      32. ElseIf Startfarbe.R < newcolor.R Then
      33. dir_r = 1
      34. End If
      35. If Startfarbe.G > newcolor.G Then
      36. dir_g = -1
      37. ElseIf Startfarbe.G < newcolor.G Then
      38. dir_g = 1
      39. End If
      40. If Startfarbe.B > newcolor.B Then
      41. dir_b = -1
      42. ElseIf Startfarbe.B < newcolor.B Then
      43. dir_b = 1
      44. End If
      45. r = Startfarbe.R
      46. g = Startfarbe.G
      47. b = Startfarbe.B
      48. Do
      49. 'Berechnung des nächsten Farbschrittes
      50. If dir_r <> 0 Then r = r + dir_r
      51. If dir_g <> 0 Then g = g + dir_g
      52. If dir_b <> 0 Then b = b + dir_b
      53. 'wenn der aktuelle Farbwert den Zielwert erreicht hat, dann
      54. 'die Richtungs-Variable auf 0
      55. If r = newcolor.R Then dir_r = 0
      56. If g = newcolor.G Then dir_g = 0
      57. If b = newcolor.B Then dir_b = 0
      58. 'Farbe verändern
      59. l.FindForm.BeginInvoke(Sub()
      60. If Art = enArt.ForeColor Then
      61. l.ForeColor = Color.FromArgb(r, g, b)
      62. Else
      63. l.BackColor = Color.FromArgb(r, g, b)
      64. End If
      65. End Sub)
      66. If dir_r = 0 AndAlso
      67. dir_g = 0 AndAlso
      68. dir_b = 0 Then Exit Do
      69. 'Um den Effekt etwas sichtbarer zu machen...
      70. Threading.Thread.Sleep(1)
      71. Loop
      72. 'Event abfeuern, falls man informiert werden will,
      73. '...dass der Vorgang fertig ist
      74. RaiseEvent finishedcoloring(l)
      75. End Sub)
      76. 'Als BG-Thread definieren.
      77. 'Sonst läuft der Thread weiter, wenn die Form geschlossen ist...
      78. '... Zugriff auf Steuerelement, ... >> exception
      79. thr.IsBackground = True
      80. 'Los geht's
      81. thr.Start()
      82. 'TODO: Event, wenn die Form frühzeitig geschlossen wird.
      83. 'License: "Do whatever you want, but don't blame me"
      84. '######## Der Code darf frei verwendet, verändert werden
      85. '######## Namensnennung nicht notwendig
      86. End Sub
      87. End Module



      VB.NET-Quellcode

      1. lblWhatever.setForeGroundColor(Color.Red)
      2. Me.setBackGroundColor(Color.Green)
      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