Linie zeichnen mit CreateGraphics

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von BerryB.

    Linie zeichnen mit CreateGraphics

    Hallo,
    ich versuche verzweifelt zur Laufzeit eine Linie auf eine Form zu zeichnen.
    Mit dem Paint-Ereignishandler funktioniert es. Leider klappt es nicht mit CreateGraphics.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    2. Dim g As Graphics = e.Graphics
    3. g.DrawLine(Pens.Black, 5, 200, 5, 300)
    4. End Sub
    5. Private Sub Linie()
    6. Dim g As Graphics = Me.CreateGraphics()
    7. g.DrawLine(Pens.Black, 10, 200, 10, 300)
    8. End Sub


    Theoretisch sollten nebeneinander zwei senkrechte Linien zu sehen sein. Ich sehe aber nur die aus dem Paint-Handler.

    Vielleicht hilft einer dieser Hinweise zur Problemlösung:
    • Das Form, in das gezeichnet werden soll, ist ein Child-Form in einer anderen Form.
    • Zur Laufzeit werden einige Controls erzeugt. Es funktioniert aber auch ohne das Erzeugen der Controls nicht.
    • g.dispose und g.refresh habe ich auch schon erfolglos getestet.
    • Die Sub "Linie" wird von FormLoad aufgerufen.
    Vielen Dank für die Bemühungen
    Verwende nie CreateGraphics, außer du musst einen String "messen".
    Alles was du mit CreateGraphics erzeugst wird beim nächsten Neuzeichnen des Controls gelöscht.
    Das ist meine Signatur und sie wird wunderbar sein!

    BerryB schrieb:

    zur Laufzeit eine Linie zu erzeugen
    Wie du es bereits in deinem ersten Post hast, macht man Zeichnungen eigentlich IMMER im Paint Event.

    BerryB schrieb:

    Geht das nur mit Hilfe von Controls?
    In Prinzip: JA. Was Du machen kannst, ist eine Klasse erstellen, welche von Control erbt. Dann kannst du die OnPaint-Methode (Methode die aufgerufen wird, wenn das Paint-Event ausgelöst wird) überschreiben und mit dem Paint-Methodenparameter e und dem darin enthaltenen Graphics-Objekt deine Linie zeichnen.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Moin,

    zeichne alles im Paint-Eventhandler. Wenn das dynamisch sein soll, speichere die Liniendaten einfach ab. Beim nächsten Neuzeichnen wird das dann gemalt. Mit Invalidate kannst du ein sofortiges Neuzeichnen des Controls/Form erzwingen.
    Mit freundlichen Grüßen,
    Thunderbolt
    Hallo Thunderbolt,

    wenn ich dich richtig verstehe, wird das Paint-Event durch "Invalidate" ausgelöst.
    Dann kann ich innerhalb des Paint-Eventhandler z.B. auf eine zuvor deklarierte Liste von Linien zurückgreifen und diese dann zeichnen lassen.
    Das werde ich ausprobieren. Danke für den Tipp.

    Funktioniert

    Ich habe das jetzt so gelöst:

    VB.NET-Quellcode

    1. Public LinienSammlung As New List(Of Point)
    2. Private Sub Zeichnen_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    3. Dim g As Graphics = e.Graphics
    4. For a As Integer = 0 To LinienSammlung.Count - 1 Step 2
    5. g.DrawLine(Pens.Black, LinienSammlung(a), LinienSammlung(a + 1))
    6. Next
    7. End Sub

    In der LinienSammlung werden immer Linienanfang und Linienende nacheinander abgelegt.

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

    Suppiie!
    Damit hast du die Haupt-Hürde beim OwnerDrawing genommen - das Umdenken vom statischen Bild hin zum dynamischen Paint-Event.
    Nu guck dir auch die ganzen Draw-Methoden an, da gibt's auch welche, wo man nur ein Punkte-Array reinschmeissen muss, und das Polygon wird gezeichnet.

    "Angucken" bedeutet: Im Objectbrowser angucken - ist dir das ein begriff?

    richtig fettes Tutorial zu OwnerDrawing habich im WinForms-Tutorial-Bereich eingestellt - musste mal nachgucken.
    Jou.
    @BerryB Dein Code würde aber eine unterbrochene Linie darstellen, da Du nur jede zweite Linie darstellst.
    Möglicherweise meinst Du dies:

    VB.NET-Quellcode

    1. For a As Integer = 0 To LinienSammlung.Count - 2
    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:

    Dein Code würde aber eine unterbrochene Linie darstellen, da Du nur jede zweite Linie darstellst.


    Es handelt sich auch um einzelne unabhängige Linien. Von daher passt es so für meine Anwendung.

    @ErfinderDesRades
    ObjectBrowser kenne ich. Habe mir die verschiedenen Überladungen des DrawLine angesehen.
    In meiner Anwendung sind es einzelne Linien und keine Polygone.
    Aber Danke für den Hinweis.