none
Wie kann ich ein e.Graphics.DrawLines Eck in eine Stiege verwandeln? Kann ich einen loop verwenden damit ich nicht jeden Punkt einzeln Eingeben muss? RRS feed

  • Frage

  • Ich habe mittels Bing zwei Möglichkeiten gefunden eine Ecke zu zeichnen.

        Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
            Dim PtsC As Point() = {New Point(82, 82), _
               New Point(82, 59), _
               New Point(105, 59)}
    
            e.Graphics.DrawLines(New Pen(Color.Black, 1), PtsC)
    
            Dim x As Integer = 182
            Dim y As Integer = 159
            Dim z As Integer = 205
    
            Dim points As New List(Of Point)
    
            points.Add(New Point(x, x))
            points.Add(New Point(x, y))
            points.Add(New Point(z, y))
    
            e.Graphics.DrawLines(Pens.Black, points.ToArray())
    
        End Sub

    Seit einigen Tagen suche ich eine Möglichkeit einen loop zu schreiben, mit dem ich eine Stiege zeichnen kann. Ich könnte auch die zwei Ecken aneinander fügen doch dann müsste ich jedes einzelne Teil der Stiege eingeben. Falls sich ein loop schreiben lässt würde ich diesen auch noch gerne variabel an die Bildschirmgröße des Ausgabefensters anpassen können.

    Danke.

    Sonntag, 1. April 2018 19:51

Antworten

  • Hi Stefan,
    besorg Dir einen Internet-Zugang mit Möglichkeit, Bilder hochzuladen.

    Meinst Du vielleicht so etwas?

    Public Class Form1
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim stufenBreite = 100
        Dim blickWinkel = 20 * Math.PI / 180
        Dim PtsC1 As Point() = {New Point(60, 60), New Point(60, 80), New Point(80, 80),
          New Point(80, 60), New Point(60, 60)}
        Dim PtsC2 As Point() = {New Point(80, 80),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(80 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(80, 60), New Point(60, 60),
          New Point(CType(60 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer))}
        For blickWinkel = 1 To stufenZahl
          e.Graphics.DrawLines(Pens.Black, PtsC1)
          e.Graphics.DrawLines(Pens.Black, PtsC2)
          For k = 0 To PtsC1.Count - 1
            PtsC1(k).X += stufenWeite
            PtsC1(k).Y += stufenHoehe
          Next
          For k = 0 To PtsC2.Count - 1
            PtsC2(k).X += stufenWeite
            PtsC2(k).Y += stufenHoehe
          Next
        Next
      End Sub
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 3. April 2018 18:11
  • Hi Stefan,
    wenn Du nur ein Treppe-Zick-Zack haben willst, reicht das:

      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim PtsC1 As Point() = {New Point(60, 60), New Point(80, 60), New Point(80, 80)}
        For i = 1 To stufenZahl
          e.Graphics.DrawLines(Pens.Black, PtsC1)
          For k = 0 To PtsC1.Count - 1
            PtsC1(k).X += stufenWeite
            PtsC1(k).Y += stufenHoehe
          Next
        Next
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 3. April 2018 19:06
  • Hi Stefan,
    eine andere Alternative ist das "Malen" einer gebrochenen Linie mit nur einer "Malanweisung":

      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim punktListe As New List(Of Point)
        Dim p1 = New Point(60, 60) ' Startpunkt
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        e.Graphics.DrawLines(Pens.Black, punktListe.ToArray)
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 4. April 2018 05:12
  • Hi Stefan,
    hier mal eine Demo als eine abwärts bewegende Treppe:

    Public Class Form1
      Private p1 As New Point(60, 60) ' Startpunkt
      Private stufenZahl As Integer = 10
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim punktListe As New List(Of Point)
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        e.Graphics.DrawLines(Pens.Black, punktListe.ToArray)
      End Sub
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler t.Tick, Sub()
                             p1 = New Point(60 + schritt, 60 + schritt)
                             If schritt > stufenWeite Then schritt = 0
                             Me.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 4. April 2018 15:08
  • Hi Stefan,
    eine weitere Alternative für eine Animation ist die Nutzung einer Matrix für eine Transformation. Dazu hier mal eine kleine Demo:

    Imports System.Drawing.Drawing2D
    
    Public Class Form1
      Private p1 As New Point(60, 60) ' Startpunkt
      Private stufenZahl As Integer = 10
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Dim punktListe As New List(Of Point)
    
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        With e.Graphics
          Using m As New Matrix
            m.Translate(schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             Me.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
    End Class


    Wenn sich die "Rolltreppe" nur in einem begrenzten Bereich bewegen soll, dann könnte ein Panel genutzt werden wie im folgendem Beispielcode:

    Imports System.Drawing.Drawing2D
    
    Public Class Form1
    
      Private p1 As New Point(-20, -20) ' Startpunkt
      Private stufenZahl As Integer = 12
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private punktListe As New List(Of Point)
      Private pan As New Panel With {.Top = 50, .Left = 50, .Width = 200, .Height = 200, .BorderStyle = BorderStyle.FixedSingle}
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pan)
        AddHandler pan.Paint, AddressOf Pan_Paint
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             pan.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
      Private Sub Pan_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
        With e.Graphics
          Using m As New Matrix
            m.Translate(schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub
    
    End Class

    --

    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks



    Donnerstag, 5. April 2018 04:00
  • Hi Stefan,
    Du brauchst nur die den Startpunkt der gebrochenen Linie und die Vorzeichen entsprechend ändern: 

      Private p1 As New Point(200, -20) ' Startpunkt
      Private stufenZahl As Integer = 12
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private punktListe As New List(Of Point)
      Private pan As New Panel With {.Top = 50, .Left = 50, .Width = 200, .Height = 200, .BorderStyle = BorderStyle.FixedSingle}
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pan)
        AddHandler pan.Paint, AddressOf Pan_Paint
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X - stufenWeite, p1.Y))
          p1 = New Point(p1.X - stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             pan.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
      Private Sub Pan_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
        With e.Graphics
          Using m As New Matrix
            m.Translate(-schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 6. April 2018 13:58

Alle Antworten

  • Hi,

    nimm eine List(Of Point). bestimme einen Startpunkt und einen horizontalen, sowie einen vertikalen Abstand (Stufenbreite, Stufenhöhe). In Deinem loop addiere jeweils abwechselnd die Stufenbreite zum x-Wert des letzten Punktes, füge diesen neuen Punkt zur Liste hinzu, dann gleiches für die Stufenhöhe mit y-Wert des letzten Punktes. Zeichne mittels DrawLines() wie gehabt. Teste eventuel für die Begrenzungen des Controls/Fensters/Bildschirms.

    Viele Grüße,

      Thorsten

    Sonntag, 1. April 2018 23:35
  • Hi Stefan,
    Thorstens Vorschlag könnte so aussehen:

      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        Dim stufenZahl = 10
        Dim stufenHoehe = 23
        Dim stufenWeite = 23
        Dim PtsC As Point() = {New Point(82, 82),
             New Point(82, 59),
             New Point(105, 59)}
        For index = 1 To stufenZahl
          e.Graphics.DrawLines(Pens.Black, PtsC)
          PtsC(0).X += stufenWeite
          PtsC(0).Y += stufenHoehe
          PtsC(1).X += stufenWeite
          PtsC(1).Y += stufenHoehe
          PtsC(2).X += stufenWeite
          PtsC(2).Y += stufenHoehe
        Next
      End Sub
    
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 2. April 2018 06:40
  • Danke für eure Beiträge zu diesem Thema. Das was ich zu erreichen suche ist leider noch nicht gelöst. Ich suche eine Seitenperspektive einer Stiege. Die Ausgabe von Peter Fleischer`s Code waren Ecken die wie Pfeilspitzen in ein und dieselbe Richtung weisen. Ich hätte zu diesem Thema gerne zwei Vergleichsbilder hochgeladen doch leider hatte ich mit meinem Versuch keinen Erfolg. Auch ein OneDrive Link wurde nur als ein broken Link dargestellt. Wie würdet Ihr mit einem Finger eine Treppe nachzeichnen?

    Sobald ich mir etwas mehr Zeit gönnen kann werde ich versuchen den Code für meine Zwecke zu modellieren, falls ich mit der Wahl meiner Wörter auf zu viel Missverständis stoßen sollte.

    Dienstag, 3. April 2018 16:46
  • Hi Stefan,
    besorg Dir einen Internet-Zugang mit Möglichkeit, Bilder hochzuladen.

    Meinst Du vielleicht so etwas?

    Public Class Form1
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim stufenBreite = 100
        Dim blickWinkel = 20 * Math.PI / 180
        Dim PtsC1 As Point() = {New Point(60, 60), New Point(60, 80), New Point(80, 80),
          New Point(80, 60), New Point(60, 60)}
        Dim PtsC2 As Point() = {New Point(80, 80),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(80 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(80, 60), New Point(60, 60),
          New Point(CType(60 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer)),
          New Point(CType(80 + stufenBreite * Math.Cos(blickWinkel), Integer), CType(60 - stufenBreite * Math.Sin(blickWinkel), Integer))}
        For blickWinkel = 1 To stufenZahl
          e.Graphics.DrawLines(Pens.Black, PtsC1)
          e.Graphics.DrawLines(Pens.Black, PtsC2)
          For k = 0 To PtsC1.Count - 1
            PtsC1(k).X += stufenWeite
            PtsC1(k).Y += stufenHoehe
          Next
          For k = 0 To PtsC2.Count - 1
            PtsC2(k).X += stufenWeite
            PtsC2(k).Y += stufenHoehe
          Next
        Next
      End Sub
    
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 3. April 2018 18:11
  • Am 03.04.2018 schrieb Stefan Mihael Rihar:

    dieselbe Richtung weisen. Ich hätte zu diesem Thema gerne zwei Vergleichsbilder hochgeladen doch leider hatte ich mit meinem Versuch keinen Erfolg. Auch ein OneDrive Link wurde nur als ein broken Link dargestellt. Wie würdet Ihr mit einem Finger eine Treppe nachzeichnen?

    Lass dein Konto in diesem Thread verifizieren, dann darfst Du auch
    Bilder einfügen und http(s) posten.
    https://social.technet.microsoft.com/Forums/en-US/090972cb-b81f-498f-b718-948caca975c4/verify-account-41?forum=reportabug
    Ohne diese Verifizierung einfach http(s) weglassen, schon kannst Du
    Links posten. :)

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    GP-PACK - PRIVACY AND TELEMETRIE: http://www.gp-pack.com/

    Dienstag, 3. April 2018 18:25
  • Genial. Vielen Dank für die Antwort. Die Lösung ist nicht genau das was ich gesucht habe, aber ich habe Peter Fleischer's Code so geändert das ich meine Lösung erreichen konnte. Die zwei Codezeilen die änderte sind wie folgt,

    Dim stufenBreite = 0 ' ich habe die totale Seitenansicht mit dem Wert Null erreicht 'e.Graphics.DrawLines(Pens.Black, PtsC1) das Auskommentieren hat nur den

    'gewünschten Teilbereich gezeigt

    Die Lösung wird mir noch viele lichte Arbeitsstunden bereiten. Auch wenn die Antwort nicht genau das war was ich suchte, werte ich Peter Fleischer's Antwort als Lösung. Falls es noch Beiträge zu diesem Thema geben sollte werde ich hin und wieder diese Seite Aufrufen. Das Thema ist gelöst worden.

    Dienstag, 3. April 2018 18:35
  • Guten Abend Winfried.

    Ich habe das was ich gelesen habe leider nicht verstehen können, den ich weiß nicht wie ich mein Konto verifizieren lassen kann? Ich habe einfach nur den Link geklickt, doch das hat mich leider noch mehr verwirrt. Könnte ich bitte noch einige Hinweise erhalten?

    Dienstag, 3. April 2018 18:42
  • Hi Stefan,
    wenn Du nur ein Treppe-Zick-Zack haben willst, reicht das:

      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim PtsC1 As Point() = {New Point(60, 60), New Point(80, 60), New Point(80, 80)}
        For i = 1 To stufenZahl
          e.Graphics.DrawLines(Pens.Black, PtsC1)
          For k = 0 To PtsC1.Count - 1
            PtsC1(k).X += stufenWeite
            PtsC1(k).Y += stufenHoehe
          Next
        Next
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Dienstag, 3. April 2018 19:06
  • Ja genau das war was ich gesucht habe. Ich brauche hin wieder einen Anstoß um weiter bei Laune zu bleiben beim suchen für meine Lösungen. Es freut mich das es Menschen gibt die auch ohne einen Cent meine Arbeit erleichtern können.
    Dienstag, 3. April 2018 19:50
  • Am 03.04.2018 schrieb Stefan Mihael Rihar:

    Ich habe das was ich gelesen habe leider nicht verstehen können, den ich weiß nicht wie ich mein Konto verifizieren lassen kann? Ich habe einfach nur den Link geklickt, doch das hat mich leider noch mehr verwirrt. Könnte ich bitte noch einige Hinweise erhalten?

    Wie alle anderen auch in diesem Thread, um Verifzierung des eigenen
    Account bitten.
    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    GP-PACK - PRIVACY AND TELEMETRIE: http://www.gp-pack.com/

    Dienstag, 3. April 2018 21:16
  • Hi Stefan,
    eine andere Alternative ist das "Malen" einer gebrochenen Linie mit nur einer "Malanweisung":

      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim stufenZahl = 10
        Dim stufenHoehe = 20
        Dim stufenWeite = 20
        Dim punktListe As New List(Of Point)
        Dim p1 = New Point(60, 60) ' Startpunkt
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        e.Graphics.DrawLines(Pens.Black, punktListe.ToArray)
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 4. April 2018 05:12
  • Da ich Animationen schreiben lernen will, werde ich am Wochenende beide (oder alle drei) Möglichkeiten versuchen mit einem Timer zu animieren. Ich strebe so etwas in der Art wie eine Rolltreppe an. Da ich nun einen genaueren Einblick habe wie man in Visual Basic tippen muss wird auch meine Wortwahl immer genauer. Es ist nicht immer leicht alle Bausteine für Projekte von mehreren logischen Seiten zusammen zu bauen. Oft genug sind meine Sichtweisen einfach nur eine Einbildung.

    Danke.

    Mittwoch, 4. April 2018 14:20
  • Guten Tag Winfried Sonntag.

    Hiermit bitte ich in diesem Thread um eine Verifizierung meines Accounts.

    Mittwoch, 4. April 2018 14:21
  • Hi Stefan,
    hier mal eine Demo als eine abwärts bewegende Treppe:

    Public Class Form1
      Private p1 As New Point(60, 60) ' Startpunkt
      Private stufenZahl As Integer = 10
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim punktListe As New List(Of Point)
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        e.Graphics.DrawLines(Pens.Black, punktListe.ToArray)
      End Sub
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler t.Tick, Sub()
                             p1 = New Point(60 + schritt, 60 + schritt)
                             If schritt > stufenWeite Then schritt = 0
                             Me.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 4. April 2018 15:08
  • Am 04.04.2018 schrieb Stefan Mihael Rihar:

    Guten Tag Winfried Sonntag.

    Hiermit bitte ich in diesem Thread um eine Verifizierung meines Accounts.

    Du musst das in diesem Thread bitten:
    https://social.technet.microsoft.com/Forums/en-US/090972cb-b81f-498f-b718-948caca975c4/verify-account-41?forum=reportabug

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    HowTos zum WSUS Package Publisher http://www.wsus.de/wpp
    GPO's: http://www.gruppenrichtlinien.de
    NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
    GP-PACK - PRIVACY AND TELEMETRIE: http://www.gp-pack.com/

    Mittwoch, 4. April 2018 17:52
  • Hi Stefan,
    eine weitere Alternative für eine Animation ist die Nutzung einer Matrix für eine Transformation. Dazu hier mal eine kleine Demo:

    Imports System.Drawing.Drawing2D
    
    Public Class Form1
      Private p1 As New Point(60, 60) ' Startpunkt
      Private stufenZahl As Integer = 10
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Dim punktListe As New List(Of Point)
    
      Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        With e.Graphics
          Using m As New Matrix
            m.Translate(schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             Me.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
    End Class


    Wenn sich die "Rolltreppe" nur in einem begrenzten Bereich bewegen soll, dann könnte ein Panel genutzt werden wie im folgendem Beispielcode:

    Imports System.Drawing.Drawing2D
    
    Public Class Form1
    
      Private p1 As New Point(-20, -20) ' Startpunkt
      Private stufenZahl As Integer = 12
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private punktListe As New List(Of Point)
      Private pan As New Panel With {.Top = 50, .Left = 50, .Width = 200, .Height = 200, .BorderStyle = BorderStyle.FixedSingle}
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pan)
        AddHandler pan.Paint, AddressOf Pan_Paint
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X + stufenWeite, p1.Y))
          p1 = New Point(p1.X + stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             pan.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
      Private Sub Pan_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
        With e.Graphics
          Using m As New Matrix
            m.Translate(schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub
    
    End Class

    --

    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks



    Donnerstag, 5. April 2018 04:00
  • Sehr geehrter Herr Fleischer. Beide Antworten sind perfekt. Ich werde mit der Zeit den Code studieren. Das einfachste ist wenn ich ein Lösung endlich vor mir habe. Nichts desto trotz muss ich auch den Inhalt noch verstehen lernen sonst stolpere ich immer wieder über meine Art Visual Basic verstehen zu lernen. Natürlich würde ich mit etwas mehr Mum in den Knochen noch weiter Fragen stellen um Animationen bis zur Trickfilm Qualität erreichen zu können. Doch ich muss, so weise schätze ich das ich bin, die Fragen stellen lernen.

    Mit freundlichem Gruß

    Donnerstag, 5. April 2018 16:15
  • Eine hoffentlich letzte Frage habe ich noch. Wie kann ich die Rolltreppe von rechts oben nach links unten verlaufen? Teilweise ist die Frage auf Grund von Erschöpfung von mir gestellt worden und teilweise weil meine Art zu suchen noch nicht reif genug ist die Visual Basic Umgebung zu meistern.
    Freitag, 6. April 2018 12:38
  • Hi Stefan,
    Du brauchst nur die den Startpunkt der gebrochenen Linie und die Vorzeichen entsprechend ändern: 

      Private p1 As New Point(200, -20) ' Startpunkt
      Private stufenZahl As Integer = 12
      Private stufenHoehe As Integer = 20
      Private stufenWeite As Integer = 20
      Private t As New Timer() With {.Interval = 50}
      Private schritt As Integer = 1
      Private punktListe As New List(Of Point)
      Private pan As New Panel With {.Top = 50, .Left = 50, .Width = 200, .Height = 200, .BorderStyle = BorderStyle.FixedSingle}
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(pan)
        AddHandler pan.Paint, AddressOf Pan_Paint
        For i = 1 To stufenZahl
          punktListe.Add(p1)
          punktListe.Add(New Point(p1.X - stufenWeite, p1.Y))
          p1 = New Point(p1.X - stufenWeite, p1.Y + stufenHoehe)
        Next
        AddHandler t.Tick, Sub()
                             If schritt > stufenWeite Then schritt = 0
                             pan.Invalidate()
                             schritt += 1
                           End Sub
        t.Start()
      End Sub
    
      Private Sub Pan_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
        With e.Graphics
          Using m As New Matrix
            m.Translate(-schritt, schritt)
            .Transform = m
            .DrawLines(Pens.Black, punktListe.ToArray)
            .ResetTransform()
          End Using
        End With
      End Sub


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 6. April 2018 13:58
  • Super, danke.
    Freitag, 6. April 2018 15:21