Рисование, перемещение и удаление сегментов линии в C#

В этом примере показано, как сделать программу рисования, которая позволяет рисовать, перемещать и удалять сегменты линии. Он основан на примере
Нарисуйте и переместите сегменты линии на C# . См. Этот пример для получения информации о том, как программа позволяет рисовать и перемещать сегменты линии.

В этом примере добавлена возможность удалять сегмент линии, перетаскивая его в корзину. Для этого программа должна рисовать мусорную корзину и обнаруживать, когда вы перемещаете на нее сегмент.

Во время разработки я добавил файлы ресурсов мусора (PNG-файл с прозрачным фоном) к ресурсам программы. (Откройте меню «Проект» и выберите «Свойства». На вкладке «Ресурсы» откройте раскрывающееся меню «Добавить ресурс» и выберите «Добавить существующий файл».) Когда программа запускается, следующий код получает размеры мусорного контейнера.

// Вычислить размеры корзины.
private int TrashWidth, TrashHeight;
private void Form1_Load(object sender, EventArgs e)
{
    const float TrashScale = 0.25f;
    TrashWidth = (int)(TrashScale *
        Properties.Resources.trash_empty.Width);
    TrashHeight = (int)(TrashScale *
        Properties.Resources.trash_empty.Height);
}

Этот код определяет переменные TrashWidth и TrashHeight. Обработчик события Load формы устанавливает эти значения в размеры мусора, умноженные на масштабный коэффициент.

Обработчик событий PaintBox Paint рисует текущие сегменты строк, как в предыдущем примере. Затем он использует следующий код для рисования корзины в верхнем левом углу.

// Нарисуем корзину.
Rectangle trash_rect = new Rectangle(0, 0,
    TrashWidth, TrashHeight);
e.Graphics.DrawImage(
    Properties.Resources.trash_empty,
    trash_rect);

Этот код просто создает прямоугольник в верхнем левом углу PictureBox, который имеет необходимые размеры мусорного ящика. Затем он вызывает e.DrawImage для рисования корзины.

Последний и самый интересный фрагмент нового кода удаляет сегмент, когда пользователь бросает его в корзину.

Когда вы перетаскиваете сегмент в новое место и затем отпустите мышь, выполняется следующий обработчик событий. Новый код отображается синим цветом.

// Остановить перемещение сегмента.
private void picCanvas_MouseUp_MovingSegment(
    object sender, MouseEventArgs e)
{
    // Сброс обработчиков событий.
    picCanvas.MouseMove += picCanvas_MouseMove_NotDown;
    picCanvas.MouseMove -= picCanvas_MouseMove_MovingSegment;
    picCanvas.MouseUp -= picCanvas_MouseUp_MovingSegment;

    // Посмотрим, находится ли мышь над корзиной.
    if ((e.X >= 0) && (e.X < TrashWidth) &&
        (e.Y >= 0) && (e.Y < TrashHeight))
    {
        if (MessageBox.Show("Delete this segment?",
            "Delete Segment?", MessageBoxButtons.YesNo)
                == DialogResult.Yes)
        {
            // Удаление сегмента.
            Pt1.RemoveAt(MovingSegment);
            Pt2.RemoveAt(MovingSegment);
        }
    }

    // Перерисовать.
    picCanvas.Refresh();
}

Этот код сбрасывает обработчики событий PictureBox для ситуации, когда пользователь ничего не перетаскивает. Затем новый код определяет, находится ли мышь над корзиной. Если это так, программа запрашивает у пользователя, следует ли удалять сегмент линии. Если пользователь нажимает «Да», программа удаляет точки, которые определяют сегмент, который был перетащен.

Источник: http://csharphelper.com/blog/2015/01/draw-move-delete-line-segments-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector