Позвольте пользователю нарисовать эллипсы резиновой ленты (или другие фигуры) в 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, чтобы стереть пунктирный эллипс.
