GDI+ Objekte nach zeichnen noch verfügbar?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von FredM.

    GDI+ Objekte nach zeichnen noch verfügbar?

    Hallo zusammen,

    eine kurze Frage, wir kennen ja alle Paint, man zeichne einen Kreis lässt diesen los und schon "brennt" er sich in den Hintergrund, man kann also nicht mehr hingehn den Kreis anklicken und ihn verschieben. Ich hab mich noch nicht wirklich mit GDI+ beschäftigt, deshalb die Frage vorweg.
    Hat man die selbe Problematik mit GDI+? oder existieren die gezeichneten Objekte auch noch nach dem Zeichnen? Selbst Paint.NET hat ja diese Problematik solange man nicht mit Ebenen arbeitet.
    Falls nein, welche Möglichkeiten gibt es sowas zu realisieren?
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    Hat man die selbe Problematik mit GDI+?
    Ja.

    Zeichnen mit GDI+ ist wie Zeichnen mit Stiften auf einem Blatt Papier. Hier ist es auch nicht so leicht, einen gezeichneten Kreis zu verschieben.
    Du kannst aber - um bei dem Vergleich zu bleiben - eine Zeichnung deines Hintergrunds machen, der sich nicht verändert. Dann zeichnest du deinen Kreis, und bei Veränderung der Position nimmst du erneut deinen Hintergrund, und zeichnest den Kreis an der neuen Position.

    GDI ist sicher nicht für aufwändige Animationen gedacht, hier gibt es andere Möglichkeiten.
    Oder Du zeichnest mit Parametern.
    Nimm NumericUpDowns für x, y und Radius eines Kreises, und bei jedem Klick rufst Du Invalidate auf.
    In der Paint-Routine holst Du Dir die Werte der Controls und malst den aktuellen Kreis.
    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!
    Vielleicht erklär ich kurz was ich vor habe.

    Ich möchte eine Baumstruktur grafisch abbilden. D.h. der Anwender kann Kreise (Knoten) setzen und diese Knoten mit Linien verbinden. Dazu habe ich eine Knoten klasse und eine Linien klasse erstellt. Hinter jedem Knoten und jeder Linie stecken gewisse Daten, die einer Berechnung dienen. Ich arbeite also gerade an der GUI, das Datenmodel hinten dran exisitert schon, allerdings eben nur in tabellarischer Form, jetzt gilt es die zu visualisieren.
    Ich zeichne meine Knoten gib beim setzen gewisse Werte ein, verbinde meine Knoten mit Linien, wobe die Linien auch Objekte mit unterschiedlichen Eigenschaften darstellen. Ist da GDI+ nicht so für geeignet?
    Bilder
    • Grafik.png

      9,64 kB, 769×447, 165 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Ist doch genau so, wie ich es beschrieben habe. Input sind Deine Daten, bei jeder Veränderung zeichnest Du neu.
    Du musst nur noch geeignet skalieren, damit Du all das, was Du sehen möchtest, auch in Deine Form bekommst. :thumbup:
    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!
    Du hast mich nicht ganz verstanden, ich möchte ja nicht nur bestehende Daten abbilden, die Grafik muss ja auch interaktiv sein. Z.b. rechtsklick auf einen Knoten machen und "löschen" sagen. Da der Kreis ja nur gezeichnet ist und danach nicht mehr exisitert, kann er ja auch nicht auf ein MouseClick event reagieren, oder steh ich grad auf dem Schlauch?
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    bei GDI+ verwendet man in der Regel das Paint Event, das wird aufgerufen, wenn etwas gezeichnet werden soll. Das ist auch, wenn das Fenster z.B. minimiert wird, da dann der zuvor gezeichnete Inhalt gelöscht wird.
    Also musst du jedesmal im Paint-Event die Koordinaten und sonstige Eigenschaften deiner Baumstruktur verwenden, um diese zu zeichnen. Wenn du nun ein Objekt löschst, dann existiert das Objekt ja nicht mehr->einfach dafür sorgen, dass das Paint-Event aufgerufen wird, dies ist möglich mit der Invalidate-Methode.
    Willst du nun, dass deine Objekte noch auf Klicks reagieren können(oder sonstige Maus-Aktionen) verwendest du die Maus-Events, dort überprüfst du dann, welches Element geklickt wurde indem du alle deine Objekte durchgehst und ob die Mausposition mit einem dieser Objekte kollidiert, dann reagierst du entsprechend.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok im Prinzip verstanden, aber das stell ich mir bei einer Linie etwas schwierig vor.

    Eine Linie wird ja so gezeichnet:

    Dim stift As New Pen(Color.Black, 1)
    z.DrawLine(stift, 50, 100, 60, 500)

    Also x/y von Start und Endpunkt. Aber wenn ich diese Linie jetzt anklicke, dann kann ich ja nur auf die zwei Punkte prüfen oder?
    Ich könnte mir höchstens vorstellen eine Geradengleichung aufzustellen und dann zu prüfen ob mein Punkt auf der Geraden liegt. Das klingt nach ziemlich viel Programmiererei hatte mir das einfacher vorgestellt. Aber gut wenn es kein anderen Weg gibt.
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Das Niveau Deiner Fragen und Dein Vorhaben scheint mir nicht ganz zusammenzupassen.
    Gehen wir also mal einen Schritt zurück und formulieren eine Reihe von Einzelproblemen, die dann einzeln und unabhängig voneinander von Dir bearrbeitet werden sollten.
    Lege für jedes Einzelproblem ein neues kleines Testprogramm an, in dem Du nur dieses und keine anderen Probleme behandelst.
    Wenn Du dann alle Teilprobleme zu Deiner Zufriedenheit gelöst hast, erstelle ein neues Programm, in dem Du alle Deine Teillösungen zusammenfasst.
    Da hast Du absolut sauber gekapselten Code und unheimlich viel gelernt.
    Und nun überleg Dir, in welche Einzelprobleme Du Dein Vorhaben zerlegen solltest:
    - Datenhaltung
    - Daten laden und speichern
    - grafische Darstellung
    - Reaktion auf Mauserreignisse
    ...
    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!
    keine Sorge, Punkt 1 und 2 hab ich schon geklärt, das mach ich mit einem typisierten Dataset. Das wurde hier schon ausgiebig diskutiert: vb-paradise.de/programmieren/h…-programmieren-mit-vb-net
    Das mit der Graphic-Path Klasse hört sich gut an, die werd ich mir jetzt mal in ruhe anschauen und ein paar Tutorials machen, ich denke das wird mir weiterhelfen.
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

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