GDI+ Frage

Alexander12

Erfahrenes Mitglied
Hi.

Ich versuche gerade erfolglos hinzubekommen, wie Ich eine Linie zeichne, während der Mausbutton gedrückt ist, also wie bei Paint, wo das ergebnis schon bei jeder Mausbewegung sichtbar ist und wenn Man den Mausbutton loslässt die Linie fixiert wird.

Mein bisheriger Code, der nicht funktioniert:

Code:
public bool mouse = false;
public int x1,y1,x2,y2;
		
void MainFormMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
	if(mouse == false)
	{
		this.x1 = MousePosition.X;
		this.y1 = MousePosition.Y;
		this.mouse = true;
	}
	this.x2 = MousePosition.X;
	this.y2 = MousePosition.Y;
	Graphics g = this.CreateGraphics();
	Pen myPen = new Pen(this.color1.Color);
	g.DrawLine(myPen,x1,y1-26,x2,y2-26);
}
		
void MainFormMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
	Graphics g = this.CreateGraphics();
	Pen myPen = new Pen(this.color1.Color);
	g.DrawLine(myPen,x1,y1-26,x2,y2-26);
}

Hier klickt Man auf 2 Punkte in der Form und er zeichnet eine direkte Linie.

Weiß jemand wie Ich den code ändern muss, dass das oben genannte geht? :(


MfG Alexander12
 

Alexander Schuc

crazy-weasel
Hallo.

Das du das Paint-Event benutzen sollst hab ich dir schon gesagt, oder?

Code:
private Line current;
private List<Line> lines = new List<Line>();

private void DrawPanel_Paint(object sender, PaintEventArgs e)
{
	foreach (Line l in lines)
	{
		e.Graphics.DrawLine(Pens.Blue, l.Start, l.End);
	}

	if (current != null)
		e.Graphics.DrawLine(Pens.Red, current.Start, current.End);
}

private void DrawPanel_MouseDown(object sender, MouseEventArgs e)
{
	if (current == null)
		current = new Line();

	current.Start = new Point(e.X, e.Y);
	current.End = current.Start;
}

private void DrawPanel_MouseUp(object sender, MouseEventArgs e)
{
	current.End = new Point(e.X, e.Y);
	lines.Add(current);
	current = null;

	DrawPanel.Invalidate();
}

private void DrawPanel_MouseMove(object sender, MouseEventArgs e)
{
	if (current != null)
	{
		current.End = new Point(e.X, e.Y);

		DrawPanel.Invalidate();
	}
}

Line sieht der Einfachheit wegen nur mal so aus.
Code:
public class Line
{
	public Point Start;
	public Point End;
}

Für .net 1.x statt der Liste einfach halt nen ArrayList nehmen.


MfG,
Alex
 

Neue Beiträge