Позвольте пользователю нарисовать эллипсы резиновой ленты (или другие фигуры) в C#
// Эллипсы рисования. private ListEllipses = new List (); // Точки для нового эллипса, который мы рисуем. private Point StartPoint, EndPoint; private bool DrawingNew = false; // Нарисуем текущие эллипсы. private void picCanvas_Paint(object sender, PaintEventArgs e) { // Рисуем существующие эллипсы. foreach (Rectangle rect in Ellipses) { e.Graphics.DrawEllipse(Pens.Black, rect); } // Если мы создаем новый эллипс, нарисуем его. if (DrawingNew) { using (Pen dashed_pen = new Pen(Color.Green, 0)) { dashed_pen.DashStyle = DashStyle.Custom; dashed_pen.DashPattern = new float[] { 5, 5 }; Rectangle rect = new Rectangle( Math.Min(StartPoint.X, EndPoint.X), Math.Min(StartPoint.Y, EndPoint.Y), Math.Abs(StartPoint.X - EndPoint.X), Math.Abs(StartPoint.Y - EndPoint.Y)); e.Graphics.DrawEllipse(dashed_pen, rect); } } }
Программа представляет собой эллипсы со списком структур Rectangle с именем Ellipses. Он представляет начальный и конечный углы нового эллипса с переменными StartPoint и EndPoint.
Когда происходит обработчик событий Paint, программа проходит через коллекцию Ellipses, рисует существующий эллипс. Затем, если программа в настоящее время рисует новый эллипс, код создает кисть, устанавливает его тире для создания длинных тире и рисует новый эллипс.
Когда происходит обработчик событий Paint, программа проходит через коллекцию Ellipses, рисует существующий эллипс. Затем, если программа в настоящее время рисует новый эллипс, код создает кисть, устанавливает его тире для создания длинных тире и рисует новый эллипс.
...
// Начнем выбирать эллипс. private void picCanvas_MouseDown(object sender, MouseEventArgs e) { DrawingNew = true; StartPoint = e.Location; EndPoint = e.Location; } // Продолжим рисование нового эллипса. private void picCanvas_MouseMove(object sender, MouseEventArgs e) { if (!DrawingNew) return; EndPoint = e.Location; picCanvas.Refresh(); } // Завершите рисование нового эллипса. private void picCanvas_MouseUp(object sender, MouseEventArgs e) { if (!DrawingNew) return; DrawingNew = false; // Если начальная и конечная точки разные, // сохраняем новый эллипс. if (StartPoint.X != EndPoint.X && StartPoint.Y != EndPoint.Y) { Rectangle rect = new Rectangle( Math.Min(StartPoint.X, EndPoint.X), Math.Min(StartPoint.Y, EndPoint.Y), Math.Abs(StartPoint.X - EndPoint.X), Math.Abs(StartPoint.Y - EndPoint.Y)); Ellipses.Add(rect); } picCanvas.Refresh(); }
Обработчик событий MouseDown сохраняет позицию мыши в переменной StartPoint и устанавливает DrawingNew = true.
Обработчик событий MouseDown сохраняет позицию мыши в переменной StartPoint и устанавливает DrawingNew = true.
...
Если DrawingNew является true, обработчик события MouseUp определяет, имеет ли новый эллипс ненулевую ширину и высоту и, если это делает, добавляет новый эллипс в список Ellipses. Затем он обновляет PictureBox, чтобы стереть пунктирный эллипс.