Позвольте пользователю нарисовать эллипсы резиновой ленты (или другие фигуры) в C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Эллипсы рисования. private List<Rectangle> Ellipses = new List<Rectangle>(); // Точки для нового эллипса, который мы рисуем. 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, рисует существующий эллипс. Затем, если программа в настоящее время рисует новый эллипс, код создает кисть, устанавливает его тире для создания длинных тире и рисует новый эллипс.
...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// Начнем выбирать эллипс. 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, чтобы стереть пунктирный эллипс.