Der Farbverlauf in einem bewegtem Sechseck ist nur auf einer Seite erreichbar.

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Der Farbverlauf in einem bewegtem Sechseck ist nur auf einer Seite erreichbar.

    Bei der Suche mein Projekt zu Ende zu bringen tu ich dies Offenkundig hier. Der folgende Code der für eine Form Ausgabe nur zu kopieren und einzufügen ist, stellt ein Sechseck das sich von links nach rechts bewegt dar. Vor dem Rückweg wird das Sechseck mit Farbverlauf grün. Ich schaffe es mit meiner Logik nicht den Farbverlauf auch auf der linken Seite zu erreichen. Die Bewegung des Sechsecks sollte erhalten bleiben.

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class Form1
    3. Dim diveIt As Integer
    4. Dim schritt As Integer
    5. Dim bud As Integer
    6. Dim CountUp As Boolean = True
    7. Dim t As New Timer() With {.Interval = 10}
    8. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    9. CenterToScreen()
    10. diveIt = 0
    11. bud = 0
    12. schritt = 1
    13. AddHandler t.Tick, Sub()
    14. If CountUp = True Then
    15. If diveIt <= 128 Then
    16. diveIt += schritt
    17. ElseIf bud < 253 Then
    18. bud = bud + 1
    19. Else
    20. CountUp = False
    21. End If
    22. End If
    23. If CountUp = False Then
    24. If bud > 0 Then
    25. bud = bud - 1
    26. ElseIf diveIt > 0 Then
    27. diveIt -= schritt
    28. Else
    29. CountUp = True
    30. End If
    31. End If
    32. Refresh()
    33. End Sub
    34. t.Start()
    35. End Sub
    36. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    37. Dim Punkte(5) As Point
    38. Dim xSeite As Integer = Me.ClientSize.Width \ 10
    39. Dim ySeite As Integer = Me.ClientSize.Height \ 10
    40. Dim seitenDrehung As Double = 0
    41. Dim vieleckEigenschaft As Double = 2 * Math.PI / 6
    42. For i As Integer = 0 To Punkte.Length - 1
    43. Punkte(i).X = CInt(((xSeite + diveIt) + 49) + xSeite * Math.Cos(seitenDrehung))
    44. Punkte(i).Y = CInt((ySeite + 104) + ySeite * Math.Sin(seitenDrehung))
    45. seitenDrehung += vieleckEigenschaft
    46. Next i
    47. Dim lichtHupe As New GraphicsPath()
    48. lichtHupe.AddPolygon(Punkte)
    49. Dim einDimensional As New PathGradientBrush(lichtHupe)
    50. e.Graphics.DrawPolygon(Pens.Black, Punkte)
    51. einDimensional.CenterColor = Color.FromArgb(bud, 0, 255, 0)
    52. Dim colors As Color() = {Color.FromArgb(bud, 0, 255, 0)}
    53. einDimensional.SurroundColors = colors
    54. e.Graphics.FillPolygon(einDimensional, Punkte)
    55. End Sub
    56. End Class
    @Stefan Mihael Rihar Willkommen im Forum. :thumbup:
    Verwende keine anonymen Methoden.
    Ich hab mal den Timer auf die GUI gezogen und die Timer-Tick-Prozedur separiert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If CountUp Then
    3. If diveIt <= 128 Then
    4. diveIt += schritt
    5. ElseIf bud < 253 Then
    6. bud += 1
    7. Else
    8. CountUp = False
    9. End If
    10. Else ' hier reicht ein Else
    11. If diveIt > 0 Then ' die ersten beiden Bedingungen getauscht
    12. diveIt -= schritt
    13. ElseIf bud > 0 Then
    14. bud -= 1
    15. Else
    16. CountUp = True
    17. End If
    18. End If
    19. Invalidate()
    20. End Sub
    Ich hoffe, das ist es, was Dir vorschwebt. ;)
    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!
    Nein. Das ist nicht was ich erreichen will. Ich würde gerne, dass das Grüne "Licht" auf der rechten Seite an und wieder ausgeht wie in meinem Beispiel und das es auch auf der linken Seite an und wieder ausgeht. Da Boolean nur zwei Zustände erlaubt weiß ich einfach nicht wo ich ansetzen soll.

    Der für mich Aufwendige Teil der Antwort ist, dass ich nicht wußte das es eine anonyme Methode ist. Ich habe deinen Sub Zweig in meinem Code verwendet nur musste ich wieder eine Timer Objekt einfügen. Dies verhindert ein einfaches copy and paste des gesamten code ausschnittes und da ich nicht wußte warum aber es hat sich nichts bewegt ich zu meiner Methode zurückgriff. Ich versuche alle mir möglichen Arten des VB.Net schreibens zu respektieren nur manches kann ich nicht nachvollziehen.

    Gelöschter Benutzer schrieb:

    nur musste ich wieder eine Timer Objekt einfügen
    welches Du eh schon hast, siehe Post#1, Zeile#7. Einfach in RfGs Code bei Zeile#1 am Ende eben Handles t.Tick und in der Zeile#7 Dim WithEvents t schreiben.

    ##########

    Code mit dem gewünschten Effekt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Public Class Form1
    4. Dim diveIt As Integer
    5. Dim schritt As Integer
    6. Dim bud As Integer
    7. Dim CountUp As Boolean = True
    8. Private IlluminateGreenLightMode As Integer = 0
    9. Dim WithEvents t As New Timer() With {.Interval = 10}
    10. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    11. CenterToScreen()
    12. diveIt = 0
    13. bud = 0
    14. schritt = 1
    15. t.Start()
    16. End Sub
    17. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    18. Dim Punkte(5) As Point
    19. Dim xSeite As Integer = Me.ClientSize.Width \ 10
    20. Dim ySeite As Integer = Me.ClientSize.Height \ 10
    21. Dim seitenDrehung As Double = 0
    22. Dim vieleckEigenschaft As Double = 2 * Math.PI / 6
    23. For i As Integer = 0 To Punkte.Length - 1
    24. Punkte(i).X = CInt(((xSeite + diveIt) + 49) + xSeite * Math.Cos(seitenDrehung))
    25. Punkte(i).Y = CInt((ySeite + 104) + ySeite * Math.Sin(seitenDrehung))
    26. seitenDrehung += vieleckEigenschaft
    27. Next i
    28. Dim lichtHupe As New GraphicsPath()
    29. lichtHupe.AddPolygon(Punkte)
    30. Dim einDimensional As New PathGradientBrush(lichtHupe)
    31. e.Graphics.DrawPolygon(Pens.Black, Punkte)
    32. einDimensional.CenterColor = Color.FromArgb(bud, 0, 255, 0)
    33. Dim colors As Color() = {Color.FromArgb(bud, 0, 255, 0)}
    34. einDimensional.SurroundColors = colors
    35. e.Graphics.FillPolygon(einDimensional, Punkte)
    36. End Sub
    37. Private Sub t_Tick(sender As Object, e As EventArgs) Handles t.Tick
    38. If IlluminateGreenLightMode > 0 Then
    39. If IlluminateGreenLightMode = 1 Then
    40. bud += 1
    41. If bud = 255 Then IlluminateGreenLightMode = 2
    42. Else
    43. bud -= 1
    44. If bud = 0 Then IlluminateGreenLightMode = 0
    45. End If
    46. Else
    47. If CountUp Then
    48. If diveIt <= 128 Then
    49. diveIt += schritt
    50. Else
    51. IlluminateGreenLightMode = 1
    52. CountUp = False
    53. End If
    54. Else
    55. If diveIt > 0 Then
    56. diveIt -= schritt
    57. Else
    58. IlluminateGreenLightMode = 1
    59. CountUp = True
    60. End If
    61. End If
    62. End If
    63. Invalidate()
    64. End Sub
    65. End Class


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ich habe am Ende des Codes bei Zeile Eins Handles Timer1.Tick mit Handles t.Tick ersetzt, denn wenn ich einfach nur am Ende etwas oder genau Handles t.Tick schreibe bekomme ich Kabelsalat mit meinem InteliSens. Aber auch wenn ich die zu ersetzende Variante berücksichtige bekomme ich als Ausgabe:

    VB.NET-Quellcode

    1. Fehler 1 Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.

    Jou. Da ich nicht erneut antworten konnte, hatte ich meinen Post modifiziert. Ich dächt, dass das sichtbar wird. Wohl nicht. Nun nochmal der Hinweis auf den modifizierten Post#5.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Gelöschter Benutzer schrieb:

    Da Boolean nur zwei Zustände erlaubt weiß ich einfach nicht wo ich ansetzen soll.
    Ganz einfach: das Boolean durch ein entsprechendes Enum austauschen.

    Gelöschter Benutzer schrieb:

    Dies verhindert ein einfaches copy
    Das ist eine dumme Ausrede, insbesondere dann, wenn Du den Code nicht verstanden hast. ;)
    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!
    Der Enum Befehl ist eine sehr gute Idee. Sie kann in meinem Kurzeitgedächtnis ein wenig an der Oberfläche kratzen. Doch die zweite Behauptung stimmt nicht. Ich habe wie schon erwähnt
    Stefan Mihael schrieb
    zu respektieren nur manches kann ich nicht nachvollziehen
    , nicht immer eine Ahnung von dem was objektiv möglich währe. Es ist einfach einfacher für mich in Foren keine Angaben über Buttons zu machen. Die Benennungen in einen Zusammenhang zu bringen ist nicht eine meiner Stärken.

    Außerdem ist die Möglichkeit nicht mehr in anonymisierter Form wie VaporiZed im Code schrieb eine sehr gute Variante auch ohne Buttons auszukommen und noch mehr zu lernen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()