// В момент отпускания кнопки мыши, когда указатель - над компонентом (сохранение звезды в картинку) private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (MainForm.CurFigure == Figures.Star || MainForm.CurFigure == Figures.FilledStar) { // Получаем поверхность рисования из картинки Graphics g = Graphics.FromImage(bmp); // Создаём перо и настраиваем так, чтоб линия не распадалась на пиксели var pen = new Pen(MainForm.CurColor, MainForm.CurWidth); pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; pen.StartCap = System.Drawing.Drawing2D.LineCap.Round; pen.EndCap = System.Drawing.Drawing2D.LineCap.Round; float R = Math.Max(e.X - oldX, e.Y - oldY) / 2f; float r = R / 2; int n = MainForm.StarTips; bool isFilled = MainForm.CurFigure == Figures.FilledStar ? true : false; if (R < 0 || r < 0 || n <= 0) { return; } FiguresPainter.DrawStar(g, pen, oldX, oldY, R, r, n, isFilled: isFilled); // После рисования инвалидируем рисунок для отображения изменений pictureBox1.Invalidate(); } }
// Возникает при наведении указателя мыши на компонент (пишем координаты мыши в статус, рисуем) private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { // Пишем координаты мыши в статус var p = MdiParent as MainForm; p.toolStripStatusLabel1.Text = $"X:{e.X} Y:{e.Y}"; if (e.Button == MouseButtons.Left) { if (MainForm.CurFigure == Figures.None) { // Получаем поверхность рисования из картинки Graphics g = Graphics.FromImage(bmp); // Создаём перо и настраиваем так, чтоб линия не распадалась на пиксели var pen = new Pen(MainForm.CurColor, MainForm.CurWidth); pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; pen.StartCap = System.Drawing.Drawing2D.LineCap.Round; pen.EndCap = System.Drawing.Drawing2D.LineCap.Round; g.DrawLine(pen, oldX, oldY, e.X, e.Y); oldX = e.X; oldY = e.Y; // После рисования инвалидируем рисунок для отображения изменений pictureBox1.Invalidate(); } else { pictureBox1.Refresh(); // затираем предыдущие несохранённые звёзды, если есть, принудительно перерисовывая всё // Получаем поверхность рисования из картинки Graphics g = pictureBox1.CreateGraphics(); // Создаём перо и настраиваем так, чтоб линия не распадалась на пиксели var pen = new Pen(MainForm.CurColor, MainForm.CurWidth); pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; pen.StartCap = System.Drawing.Drawing2D.LineCap.Round; pen.EndCap = System.Drawing.Drawing2D.LineCap.Round; float R = Math.Max(e.X - oldX, e.Y - oldY) / 2f; float r = R / 2; int n = MainForm.StarTips; bool isFilled = MainForm.CurFigure == Figures.FilledStar ? true : false; if (R < 0 || r < 0 || n <= 0) { return; } FiguresPainter.DrawStar(g, pen, oldX, oldY, R, r, n, isFilled: isFilled); } } }