Benutzer mit den meisten Antworten
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?

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.
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:15
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:15
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:18
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:18
-
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
- Als Antwort vorgeschlagen Peter Fleischer Donnerstag, 5. April 2018 04:01
- Bearbeitet Peter Fleischer Donnerstag, 5. April 2018 05:29 zusätzlicher Code
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:21
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 10. April 2018 05:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:23
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
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
-
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.
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:15
-
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/ -
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,
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.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
-
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?
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:15
-
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/ -
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:18
-
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.
-
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- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 4. April 2018 15:16
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:18
-
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=reportabugServus
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/ -
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
- Als Antwort vorgeschlagen Peter Fleischer Donnerstag, 5. April 2018 04:01
- Bearbeitet Peter Fleischer Donnerstag, 5. April 2018 05:29 zusätzlicher Code
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:21
-
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ß
-
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.
-
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- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 10. April 2018 05:51
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 20. April 2018 13:23