Laden...

picturebox mit linien verbinden

8 Antworten
3,668 Aufrufe
Letzter Beitrag: vor 18 Jahren
picturebox mit linien verbinden

Hallo 🙂

Ich möchte mehrere Pictureboxen mit Linien verbinden und zwar jeweils links oder rechts (was besser passt) mit diesen eckigen Verbindern (zB wie in Visio). Bewege ich die Boxen soll sich der Verbinder automatisch anpassen.

Dazu habe ich mir eine Klasse gebastelt, in der ich von Picturebox ableite und alles reinwurschtel was das Kästchen können soll (Drag/Drop, Texte, Hintergrund usw.).

Diese Objekte erzeuge ich in einem Form und berechne dort die Anfangs- und Endpunkte für meine Verbindungslinie, die erst einmal nur gerade ist (hat jemand eine Idee wie man die eckigen Verbinder umsetzt?)

Jetzt habe ich drei Versionen probiert und nichts tut wie ichs gerne hätte X(

  1. per Refresh() -> flackert ohne Ende und sieht mehr nach billigem Paint aus (es gibt keine Linie sondern ein pixeliges Etwas aus 1000 einzelnen Linien)
  2. wie 1, zusätzlich noch double buffer -> die Kästchen schlafen ein beim Bewegen
  3. auf Knopfdruck -> tut, will ich aber nicht 😁

Gezeichnet wird so:
In der Form:

this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

und

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.DrawLine(new Pen(Color.Violet, 3), testklasse.posX, testklasse.posY + 35, testklasse2.posX + 250, testklasse2.posY + 35);
    }

lg martina

Hallo martina

Teilantwort:

(es gibt keine Linie sondern ein pixeliges Etwas aus 1000 einzelnen Linien)

das nennt sich AliasEffekt.. das kannst du verbessern, indem du Antialias verwendest..

g.SmoothingMode = SmoothingMode.AntiAlias

greetz..

I cna tpye 300 wrods pre mnuite!

Hi,

die Linie an sich ist gerade, Anti-A. ist also nicht das was ich suche. Es werden lauter kleine Linien gezeichnet, die sich an der Bewegung des Kästchens orientieren. Ich kanns nicht besser beschreiben 😠

Diese Version hier ist die beste, allerdings auch extrem langsam und daher nicht brauchbar. Die Linie wird nach Loslassen der Maus gezeichnet und ich hätte gerne eine 'sich mitbewegende Linie', wie mans eben aus Visio und Co. kennt.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.DrawLine(new Pen(Color.Violet, 3), testklasse.posX, testklasse.posY + 35, testklasse2.posX + 250, testklasse2.posY + 35);
        this.Refresh();
        DoubleBuffered = true;
    }

lg martina

Hallo martina,

Vielleicht ist das hier [Tutorial] Gezeichnete Objekte mit der Maus verschieben das richtige für dich.

Gruß,
Thomas

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

Hi,

das mit dem Verschieben klappt schon einwandfrei.
Hatte es erst wie in dem verlinkten Beitrag versucht, allerdings war die Lösung mit der Picturebox und ner Ladung MouseEvents passender, bzw. optisch schöner.

Jetzt scheitert es im Endeffekt nur am 'Aussehen' des Verbinders und der Geschwindigkeit des Refrehs 🙁

lg martina

this.Refresh() gehört nicht in die Paint Methode und doublebuffered reicht einmal im Konstruktor.

siehe dazu auch : Link

Hi,

erstmal Danke für die ganzen Antworten 🙂

Irgendwie passt es alles nicht. Ich krieg das Invalidate einfach nicht dahin, wo es hinsoll...

Ich hab eine Klasse a, in der ich von picturebox ableite.
In Klasse b erzeuge ich 2 Objekte von a und verbinde diese mit einer Linie. Ich male auf das Bild einer Picturebox, wie im Tutorial beschrieben.
In Klasse c erzeuge ich dann wiederum ein Objekt von b.

Bei einem MouseUp auf einem der 'a'-Pictureboxen soll die Linie neu gezeichnet werden.
Und hier weiß ich einfach nicht mehr weiter. Wie kann ich den Objekten der Klasse b klarmachen, daß sie etwas tun, wenn man auf ein Objekt der Klasse a klickt?

Ich hoffe mal, das war nicht zu verwirrend - ich bins nämlich mittlerweile X(

martina

Hallo martina,

es wird einfacher sein, wenn du keine PictureBoxen verwendest, sondern die Bilder zusammen mit den Linien zeichnest.

Zum Grundlegenden siehe [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox)

Zum Erkennen von Klicks über den Bildern, kennst du ja schon das Tutorial von progger.

herbivore