Позвольте пользователю нарисовать эллипсы резиновой ленты (или другие фигуры) в C#

// Эллипсы рисования.
private List Ellipses = 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, чтобы стереть пунктирный эллипс.

Источник: http://csharphelper.com/blog/2015/05/let-the-user-draw-rubber-band-ellipses-or-other-shapes-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector