C# Linie von Hand zeichnen (Aktualisierung während des Zeichnens)

...komplette Frage anzeigen

2 Antworten

Zum Zeichnen geb ich dir den Tipp, nicht auf der Form sondern eher auf einem Control zum zeichnen.Hierbei kannst du die PictureBox oder das Panel benutzen. Wenn du auf der Form zeichnest, musst du, damit die änderungen angezeigt werden die ganze Form neu zeichnen bzw. aktualisieren. Da es länger dauert die Form zu aktualisieren als ein einzelnes Control, kommt es zum flackern.

Du hast ansich schon den richtigen Gedanken, es wär aber leichter dir zu helfen, wenn du dein Code hier postest. Ich vermute das du etwas beim zeichnen falsch machst, ich poste einfach mal ein kleines Beispiel wie ich eine Linie zeichnen würde:

bool MouseDown = false;
Point LineStart;
Point LineEnd;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    MouseDown = true;
    LineStart = e.Location;
    LineEnd = Point.Empty;
    pictureBox1.Invalidate();
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (MouseDown)
    {
        LineEnd = e.Location;
        pictureBox1.Invalidate();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    MouseDown = false;

    //unnötig durch das setzen bei Move;
    LineEnd = e.Location;
    pictureBox1.Invalidate();
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (LineStart != Point.Empty &&
        LineEnd != Point.Empty)
    {
        Graphics g = e.Graphics;

        g.DrawLine(new Pen(Color.Black), LineStart, LineEnd);
    }
}

PS: Ich würd's sicherlich doch noch ganz anders machen, es ist nur ein Beispiel der einfachsten art und weise wie ich eine Linie zeichnen würde.

Solltest du mehr Linien zeichnen wollen, erstell dir eine Klasse und eine Liste.

Das flackern könnte man aber durch doubleBuffered lösen oder?

0
@Walla28

Hab den Begriff zwar schonmal gehört, weiß jedoch gerade nichts damit anzufangen. Ansich würd' ich aber empfehlen stets auf ein Control zu zeichnen.

0
@KlickKlackKluck

Naja grob gesagt wird der Puffer noch mal gepuffert. Man sammelt alles zusammen und zeichnet es dann auf einmal alles neu. Das kann das flackern verhindern. Ist auch ne weile her, dass ich das benutzt habe. Ich weiß aber noch, dass man explizit sagen muss, dass er dann neuzeichnen soll. Kann Vorteile haben.

Aber ich wollte hier nicht ins Off-Topic abrutschen ^^

Ich geb dir recht, auf ein Control zeichnen ist am besten. Ich nehm für sowas meist ein einfaches Panel, weil es am einfachsen aufgebaut ist und im Grundzustand völlig nackig ist.

0

MouseDown und MouseMove-Events listenen. Wenn MouseDown, dann jedes mal wenn MouseMove-Event kommt and Position vom Coursor einen Punkt setzen. Verabschiede dich vom Linien-Gedanken. Wobei du ggf zwischen zwei Punkten interpolieren musst.

Was möchtest Du wissen?