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(
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..
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
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