Laden...

Wie kann ich Linien zeichnen und bei Events Teile der Linien einfärben?

Erstellt von hlag vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.188 Views
H
hlag Themenstarter:in
8 Beiträge seit 2013
vor 3 Jahren
Wie kann ich Linien zeichnen und bei Events Teile der Linien einfärben?

Nabend Leute,

Ich krieg nen knoten ins Hirn.
Eigentlich ist es ganz einfach: ich habe eine simple modelleisenbahnstrecke.
Diese möchte ich Grafisch darstellen. Sie besteht aus verschiedenen Blöcken (Abschnitten). Jeder Abschnitt hat ein Kontaktgleis am Anfang und am Ende. Das ist ein Schalter, der meldet, ob was drauf rumsteht oder nicht. Die schaltvorgänge kommen über serialPort rein, ich kann sie auslesen. Jetzt möchte ich die Anlage darstellen , primitivste Mittel würden reichen.
Jeden Abschnitt mit einer farbigen Linie, rot=besetzt, grün = frei.

Die Linie sollen so ungefähr den Streckenverlauf wiedergeben.

Bei Microsoft finde ich nix, was meiner Vorstellung entspricht. Irgendwas mit paintEventArgs. Bei der Erstellung der Grafik gibts noch keine Events....

Hab den Eindruck, dass graphics nen anderen Verwendungszweck hat...
Lg Klaus

Auch die schönste Frau
ist an den Füßen
zu Ende.

C
2.121 Beiträge seit 2010
vor 3 Jahren

Ich verstehe nicht worauf genau du raus willst.
Willst du "Grafiken einbinden", also bestehende Grafikteile aneinander setzen?
Oder willst du Linien selbst zeichnen?

Für beides eignet sich ein Bitmap, auf dem du arbeitest.

Das Event zum zeichnen ist nicht das richtige für diesen Zweck. Es sagt dir wenn ein Control sich neu darstellen will.

H
hlag Themenstarter:in
8 Beiträge seit 2013
vor 3 Jahren

Hi chilic,
Ich will da ein paar Linien, am liebsten Vektor-Grafiken, und diese umfärben, wenn die Software das entsprechende event sendet.

Lg klaus

Auch die schönste Frau
ist an den Füßen
zu Ende.

C
2.121 Beiträge seit 2010
vor 3 Jahren

Linien kannst du ins Bitmap zeichnen.
Wär dann zu überlegen ob du das Bild bei jeder Änderung komplett neu zeichnest, oder nur die Linien übermalst. Letzteres könnte aber zu komischen Effekten führen, also wahrscheinlich lieber alles komplett neu aufbauen.

16.830 Beiträge seit 2008
vor 3 Jahren

Forms kann von Haus aus kein SVG verarbeiten; da musst Du Dir entsprechende Bibliotheken suchen (NuGet, GitHub...).

SVGs lassen sich jedoch auch in XAML-Grafiken umwandeln, sodass Du entsprechend WPF nutzen könntest.
Alternativ eben eine Browser-basierte Lösung (zB via TypeScript oder Blazor), da Browser Client-seitig von Haus aus SVG unterstützen.

Letzteres kommt Deinem Anwendungsfall relativ nahe; verwende ich zB für die Visualisierung von Maschinen bzw. Industrieanlagen.
Wir verwenden hier zB auch https://maxwellito.github.io/vivus/

H
hlag Themenstarter:in
8 Beiträge seit 2013
vor 3 Jahren

Hi TH96,

ja, genau den Thread hatte ich gefunden und finde den Einstieg nicht:

>> protected override void OnPaint (PaintEventArgs e)

Wo kommen denn die PaintEventArgs her? wie generiere ich die, was schreibe ich da rein?

LG Klaus

Auch die schönste Frau
ist an den Füßen
zu Ende.

4.938 Beiträge seit 2008
vor 3 Jahren

Die werden von WinForms erzeugt und geben die Parameter mit, s. PaintEventArgs, besonders Graphics, damit du mit dessen Methoden dann zeichnen kannst (wie z.B. DrawRectangle in dem Tutorial-Beispiel).

Um Linien zu zeichnen, also z.B.


protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.DrawLine(Pens.Green, 10, 20, 30, 40);
}

Du benötigst für dein Projekt am besten eine Datenstruktur


class Line
{
  public int x;
  public int y;
  public int x2;
  public int y2;
  bool free; // besetzt oder frei (alternativ: ein enum hierfür)
}

List<Line> Lines = new List<Line>();

Dieser Liste fügst du dann die verschiedenen Linien (Line) hinzu und in der OnPaint-Methode gehst du dann in einer Schleife diese Liste durch und zeichnest jede Linie mittels DrawLine (s.o.) entsprechend des Flags free in 2 verschiedenen Farben (rot und grün).

PS: Die OnPaint-Methode wird also niemals selber aufgerufen, sondern wie unter "Wie kommt die Zeichnung auf den Schirm?" im Tutorial beschrieben mittels Invalidate (bzw. Refresh), falls du ein Neuzeichnen per Programm veranlassen möchtest (z.B. wenn sich die Daten der Liste geändert haben), s.a. die Methode FormTick im Tutorial.

H
hlag Themenstarter:in
8 Beiträge seit 2013
vor 3 Jahren
Danke

tuts. Dankeschön. Die n ächsten Fragen kommen, aber da werd ich erst noch was rumexperimentieren.

LG Klaus

Auch die schönste Frau
ist an den Füßen
zu Ende.