Вам нужно иметь два вызова рисования:
MouseMove
, используя someControls.CreateGraphics
MouseUp
, где вы храните координаты и вызываете Invalidate
на свой элемент управления холстом и рисуете в Paint
событие вашего холста, используя его объект e.Graphics
. Вот минимальный пример кода:
List<Point> allPoints = new List<Point>();
Point mDown = Point.Empty;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
mDown = e.Location;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
allPoints.Add(e.Location);
pictureBox1.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button.HasFlag(MouseButtons.Left))
{
pictureBox1.Refresh();
using (Graphics G = pictureBox1.CreateGraphics())
G.DrawLine(Pens.Red, mDown, e.Location);
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (allPoints.Count > 1) e.Graphics.DrawLines(Pens.Black, allPoints.ToArray());
}
Обратите внимание, что в качестве управления холстом используется PictureBox
. Это контроль, предназначенный для такого взаимодействия. Ваш код, кажется, рисует на рабочий стол, который не принадлежит вам. Рисование на нем в постоянном порядке не похоже на то, что вы сделали бы с приложением Paint Paint.
Также обратите внимание, что мой пример хранит список точек и рисует их как одну незамкнутую полилинию. Чтобы сделать их закрытым обменом DrawLines
для DrawPolygon
! Чтобы нарисовать несколько таких полилиний или полигонов, вам нужно ...
List<List, Point>>
Также обратите внимание, что это один из редких примеров, в которых используется control.CreateGraphics
, поскольку вы на самом деле требуется не-постоянный рисунок, когда пользователь перемещает мышь.
В большинстве других случаев применяется основное правило № 1 для Winforms:
Никогда не используйте control.CreateGraphics
! Никогда не пытайтесь кэшировать объект Graphics
! Либо вставьте Bitmap bmp
, используя Graphics g = Graphics.FromImage(bmp)
или в Paint
событие элемента управления, используя параметр e.Graphics
..
Вы могли бы сделать это, но вы не обязательно сделаете это как обычный проект Dialogflow. Вот шаги: