Рисование линий с помощью GDI - проблема Invalidate () / onPaint - PullRequest
1 голос
/ 16 сентября 2011

Я изучал, как использовать GDI, но мне трудно понять, как Invalidate () и переопределяет событие onPaint, и кажется, что он вращается кругами.

У меня есть следующий код

private void DrawLine()
{
     System.Drawing.Pen myPen = new System.Drawing.Pen(System.Drawing.Color.Red);
     System.Drawing.Graphics formGraphics;
     formGraphics = this.CreateGraphics();
     formGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
     formGraphics.DrawLine(myPen, mouseDown.X, mouseDown.Y, mouseUp.X, mouseUp.Y);
     myPen.Dispose();
     formGraphics.Dispose();
}

protected override void OnPaint(PaintEventArgs e)
{
     DrawLine();
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
     mouseDown = e.Location;

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
     mouseUp = e.Location;           
}

Тем не менее, единственный способ получить линию, которую я только что нарисовал, - это вызвать Invalidate () вручную, и когда я это сделаю, она очистит все предыдущие строки. Может кто-нибудь сказать мне, где я не так с этим, пожалуйста?

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Заставьте DrawLine принять параметр Graphics:

public void DrawLine(Graphics g) { 
//...
}

В OnPaint используйте Graphics из e:

protected override void OnPaint(PaintEventArgs e)
{
     DrawLine(e.Graphics);
}

В MouseUp снова вызовите DrawLine с объектом Graphics из фонаизображение формы:

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
     mouseUp = e.Location;   
     DrawLine(Graphics.FromImage(BackgroundImage));  
     Invalidate();
}

Добавить метод MouseMove:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
     mouseUp = e.Location;   
     Invalidate();
}

Необязательно, для ясности переименуйте mouseDown в StartPoint и mouseUp - EndPoint.

1 голос
/ 16 сентября 2011

Измените это на:

Bitmap bmp = new Bitmap(256, 256);

protected override void OnPaint(PaintEventArgs e)
{
  e.Graphics.DrawImage(bmp, new Point(0, 0));
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
  mouseDown = e.Location;
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
   mouseUp = e.Location;
   using (Graphics g = Graphics.FromImage(bmp))
   {
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
     g.DrawLine(Pens.Red, mouseDown.X, mouseDown.Y, mouseUp.X, mouseUp.Y);
   }
   this.Invalidate();           
}

Метод OnPaint предоставляет графический холст, который вы используете для рисования. На самом деле, очень редко вам когда-нибудь нужно вызывать CreateGraphics самостоятельно. Вызов Invalidate () для MouseUp указывает вашему элементу управления вызвать событие OnPaint.

...