Linien auf Picturebox zeichnen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Selter98.

    Linien auf Picturebox zeichnen

    Hallo!

    Mit diesen Befehlen

    VB.NET-Quellcode

    1. Dim g As System.Drawing.Graphics
    2. Dim pen1 As New System.Drawing.Pen(Color.Black, 3)
    3. g = PictureBox1.CreateGraphics
    4. w = ZeigerWinkel(1)
    5. w = 2 * Math.PI / 360 * w
    6. x = 170 + Math.Cos(w) * 150
    7. y = 170 + Math.Sin(w) * 150
    8. g.DrawLine(pen1, 170, 170, x, y)

    sollen Uhrzeiger auf eine Picturebox gezeichnet werden, die ein Bild enthält.
    Natürlich solln die Zeiger mit der Zeit auch "wandern". Also mit

    VB.NET-Quellcode

    1. g.Clear(Me.BackColor)

    die alten Zeiger löschen. Anschließen werden diese neu gezeichnet. Das ganze läuft über einen Timer. Doch beim Löschen der Zeiger verschwindet auch das Hintergrundbild. Das Hintergrundbild kann man zwar mit

    VB.NET-Quellcode

    1. PictureBox1.BackgroundImage = Image.FromFile(My.Application.Info.DirectoryPath & "\hintergrund\antikythera.png")

    wieder neu laden, aber dann werden seltsamerweise die Zeiger nicht mehr neu gezeichnet.

    Es scheint also nur entweder Hintergrundbild oder neue Zeiger zu geben. Wie bekomme ich beides hin?
    @Selter98 Gemalt wird im Paint-Event der PictureBox.
    Mit e.Graphics hast Du den Kontext, im Timer-Event generierst Du Dir die Daten dazu und mit PictureBox1.Invalidate() erzwingst Du das Neuzeichnen.
    Feddich.
    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!
    hi!
    schau dir auch mal e.Graphics.TranslateTransform an.

    kleines Beispiel. (ist nicht wirklich ganz rund aber soll zeigen wast mit Transform machen kannst.)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Angle As Integer = 0
    2. Private Sub PictureBox2_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox2.Paint
    3. Dim sfRechts As New StringFormat
    4. Dim sfLinks As New StringFormat
    5. Dim sfMitte As New StringFormat
    6. sfMitte.Alignment = StringAlignment.Center
    7. sfMitte.LineAlignment = StringAlignment.Center
    8. sfRechts.Alignment = StringAlignment.Far
    9. sfRechts.LineAlignment = StringAlignment.Center
    10. sfLinks.Alignment = StringAlignment.Near
    11. sfLinks.LineAlignment = StringAlignment.Center
    12. e.Graphics.DrawEllipse(Pens.Red, 100, 100, 3, 3)
    13. ' Transformation
    14. e.Graphics.ResetTransform()
    15. e.Graphics.TranslateTransform(100, 100)
    16. e.Graphics.RotateTransform(Angle)
    17. ' Text ausgeben
    18. e.Graphics.DrawString("und immer im Kreis herum", fnt2_B, bBrush, 0, 0, sfLinks)
    19. e.Graphics.ResetTransform()
    20. 'Ende Transformation
    21. e.Graphics.DrawString("TEST", fnt2_B, bBrush, 33, 33, sfMitte)
    22. End Sub
    23. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    24. Angle += 1
    25. If Angle >= 360 Then
    26. Angle = 2
    27. End If
    28. PictureBox2.Invalidate()
    29. End Sub
    @Selter98 Unkreativ.
    Merge Deinen Code und den von @Dizzy und feddich:

    VB.NET-Quellcode

    1. Private Angle As Integer = 0
    2. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    3. Dim pen1 As New System.Drawing.Pen(Color.Black, 3)
    4. Dim w = Angle * Math.PI / 180
    5. Dim x = 170 + Math.Cos(w) * 150
    6. Dim y = 170 + Math.Sin(w) * 150
    7. e.Graphics.DrawLine(pen1, 170, 170, CSng(x), CSng(y))
    8. End Sub
    9. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. Angle += 1
    11. If Angle >= 360 Then
    12. Angle = 2
    13. End If
    14. PictureBox1.Invalidate()
    15. End Sub
    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
    So ist es natürlich besser. Du hast ja die Antwort schon in deinem ersten Post gegeben.
    Ich wolte Selter98 nur auf die möglichkeiten von Transform aufmerksam machen. Nur um eine linie rotieren zu lassen ist das natürlich eine schlechte wahl.
    So wie es aussieht möcht sich Selter98 eine Uhr basteln. Die Zeiger sollen ja auch was hergeben. und mit e.Graphics.RotateTransform kann man ganz easy auch imags rotieren lassen.

    p.s.
    ach ja und warum mein Beispiel nicht funktioniert ist auch klar. (sorry)
    ich habe die Brush und Font in meinem Projekt aus dem ich das kopiert habe Global deklariert. (das hat dort schon seinen sinn)

    VB.NET-Quellcode

    1. Private fnt2_B As New Font("arial", 9, FontStyle.Bold)
    2. Private bBrush As New SolidBrush(Color.Black)

    und den Timer muss man halt auch irgendwo setzen und starten.
    Bau das in FormLoad ein oder stell es im Desingener beim Timer ein.

    VB.NET-Quellcode

    1. Timer1.Interval = 1000 '(das ist 1 Sekunde)
    2. Timer1.Enabled = False

    @Selter98
    Ach ja, und sich mit zeichnen sprich GDI++ in Vb.Net zu beschäftigen ist nicht schlecht. Damit erschlägst du gleich 2 Fliegen mit einer Klappe. Du kannst auch wunderbar drucken.
    Es gibt hier im Forum unzählige Postigs mit dem Thema wie drucke ich was aus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dizzy“ ()