Sanfter Farbwechsel

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sanfter Farbwechsel

    Hi liebe Community,

    ich habe das Vorhaben, einen sanften Farbwechsel zu programmieren.
    Dazu habe ich eine Test-Anwendung programmiert, welche mir einen sanften Farbwechsel von weiß zu Blau anzeigt.
    Mein Problem ist dort, dass es mir nicht schnell genug geht.
    Ich verwende Timer, welche jedoch schon auf 1ms Interval gestellt sind...

    Mein Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub PB_MouseEnter(sender As Object, e As EventArgs) Handles PB.MouseEnter
    3. Timer_Out.Stop()
    4. Timer_In.Start()
    5. End Sub
    6. Private Sub PB_MouseLeave(sender As Object, e As EventArgs) Handles PB.MouseLeave
    7. Timer_In.Stop()
    8. Timer_Out.Start()
    9. End Sub
    10. Dim ColorIn As Color = Color.FromArgb(50, 152, 254) 'blau
    11. Dim ColorOut As Color = Color.FromArgb(255, 255, 255) 'weiß
    12. Private Sub Timer_Out_Tick(sender As Object, e As EventArgs) Handles Timer_Out.Tick
    13. 'blau -> weiß
    14. Dim R As Integer = PB.BackColor.R
    15. Dim G As Integer = PB.BackColor.G
    16. Dim B As Integer = PB.BackColor.B
    17. If Not R = ColorOut.R Then PB.BackColor = Color.FromArgb(R + 1, G, B)
    18. If Not G = ColorOut.G Then PB.BackColor = Color.FromArgb(R, G + 1, B)
    19. If Not B = ColorOut.B Then PB.BackColor = Color.FromArgb(R, G, B + 1)
    20. If PB.BackColor.R = R And PB.BackColor.G = G And PB.BackColor.B = B Then Timer_Out.Stop()
    21. End Sub
    22. Private Sub Timer_In_Tick(sender As Object, e As EventArgs) Handles Timer_In.Tick
    23. 'weiß -> blau
    24. Dim R As Integer = PB.BackColor.R
    25. Dim G As Integer = PB.BackColor.G
    26. Dim B As Integer = PB.BackColor.B
    27. If Not R = ColorIn.R Then PB.BackColor = Color.FromArgb(R - 1, G, B)
    28. If Not G = ColorIn.G Then PB.BackColor = Color.FromArgb(R, G - 1, B)
    29. If Not B = ColorIn.B Then PB.BackColor = Color.FromArgb(R, G, B - 1)
    30. If PB.BackColor.R = R And PB.BackColor.G = G And PB.BackColor.B = B Then Timer_In.Stop()
    31. End Sub
    32. End Class


    Mir fällt nur noch das Ändern des Faktors zur Addition bzw. Subtraktion ein, wobei es dort wieder Probleme geben könnte, sobald der Farbwert die 255 übersteigt...

    Wie könnte man dies sonst noch beschleunigen?


    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „TRiViUM“ ()

    TRiViUM schrieb:

    6 Sekunden
    Mach den Farbschritt (+1 / -1) variabel und ggf. größer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    nafets schrieb:

    unter 10-20ms zwischen den Ticks kommen sie kaum

    Interessant, dann frag ich mich, wieso man dann überhaupt 1ms einstellen kann :D

    @RodFromGermany
    Wie genau meinst du das mit variabel?

    Bzw. gibt es eine elegantere Lösung als die Timer?

    hab im Internet Sachen mit ​threading.thread.sleep(1) gefunden, aber das friert doch das Programm in den Zeitraum ein - äußerst unelegant.

    TRiViUM schrieb:

    variabel
    geht so:

    VB.NET-Quellcode

    1. Dim Variable = 1 ' 2 ' 3
    2. If R <> ColorOut.R Then PB.BackColor = Color.FromArgb(R + Variable, G, B)
    3. If G <> ColorOut.G Then PB.BackColor = Color.FromArgb(R, G + Variable, B)
    4. If B <> ColorOut.B Then PB.BackColor = Color.FromArgb(R, G, B + Variable)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    TRiViUM schrieb:

    Threads
    Das schaffen die auch nicht, weil Du die Anzeige invoken musst.
    Leg mal die Sequenz in einem Array ab, das Du per Index abarbeitest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Leg mal die Sequenz in einem Array ab

    Meinste sowas:

    VB.NET-Quellcode

    1. Dim ColorOut() as Byte = {255, 255, 255}
    2. Dim ColorIn() as Byte = {50, 152, 254}

    ?

    Wenn Timer die 1ms gar nicht erreichen, ist es also nicht möglich, eine dermaßen genaue Anwendung zu programmieren?
    Das mit dem Invoken der Anzeige dauert ja dann auch länger als 1ms, wodurch man ja auch wieder Verfälschung hat.
    So genau muss es ja bei mir gar nicht sein, allerdings sind mir die 6 Sekunden dann doch zu langsam :D

    Ein einfacher sanfter Farbwechsel mit veränderbarer Geschwindigkeit, ich probiere mich mal dran :)
    Winforms ist toll für Standardguis. Für alles andere nimm doch wpf. Kinderleicht mit coloranimation und das Resultat ist auch besser.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    TRiViUM schrieb:

    Meinste sowas
    Nein.
    50 oder 200 oder so Farben in einem ColorIn- und einem ColorOut-Array.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!