Eine Linie "on the fly" Zeichnen.

Tylers

Grünschnabel
Hallo,

ich habe folgendes Problem und bin diesbezüglich leider nirgends fündig geworden.


Wenn der User auf einem Panel Control mit der linken Maustaste an eine beliebige Stelle klickt, soll das der Anfangspunkt der Linie sein. Wenn jetzt die Maustaste geklickt bleibt und der Mauscursor sich ändert, muss sich der Endpunkt der Linie immer ändern. d.h. dass die Linie immer wieder neu gezeichnet werden muss. Die alte Linie muss natürlich entfernt werden.

Bis auf ein wichtiges Detail, klappt eigentlich alles. Obwohl ich ihn, nachdem ich Panel1.Invalidate() aufgerufen habe, die aktuelle Linie zeichne, löscht er dieses und zeigt sie nicht an. Was mache ich falsch? :rolleyes:

Hier der relevante Bereich meines Codes:


private void panel1_MouseMove(object sender, MouseEventArgs e)
{
panel1.Invalidate();

lokaleKoordinaten = panel1.PointToClient(Cursor.Position);

if (MouseStatus)
{
ZeichneLinie(mousePos,lokaleKoordinaten );
}

}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
mausGeklickt();
}

private void ZeichneLinie(Point p1, Point p2)
{
Graphics gr = panel1.CreateGraphics();
gr.DrawLine(new Pen(Brushes.Blue, 3), p1, p2);

gr.Dispose();
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mausKlickGeloest();
}

private void mausGeklickt()
{
MouseStatus = true;

mousePos = lokaleKoordinaten;
}


Point lokaleKoordinaten;

bool MouseStatus = false;

Point mousePos;
 
Nach einem Invalidate wird immer die Control.Draw Methode aufgerufen, die wird dir das vermutlich übermalen (läuft asynchron).
Die beste Lösung wird wohl sein, wenn du dir im MouseMove die Koordinaten in eine Variable speicherst und im Draw-Event des Panels dann die Linie zeichnest.
 
Hallo Steiner,
vielen Dank für deine schnelle Reaktion.

Leider ist mir deine Erklärung zu Hoch. Was genau meinst du mit dem Draw-Event des Panels? Ich habe jetzt danach gesucht, aber kein Draw Event des Panels gefunden.
 
Zurück