Рисование, перемещение и удаление сегментов линии в 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 для ситуации, когда пользователь ничего не перетаскивает. Затем новый код определяет, находится ли мышь над корзиной. Если это так, программа запрашивает у пользователя, следует ли удалять сегмент линии. Если пользователь нажимает «Да», программа удаляет точки, которые определяют сегмент, который был перетащен.
