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