GDI+ Рисовалка - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Ради интереса пробую по учебнику работать с GDI+. Следующий код рисует точку по нажатию клавиши мыши. Все точки добавляются в List<>:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Drawing.Drawing2D;
 
namespace Draw
{
public partial class Form1 : Form
    {
 
        public List<Point> myPts = new List<Point>();
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
 
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Dispose();
            System.Diagnostics.Process.GetCurrentProcess().Kill();
        }
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            myPts.Add(new Point(e.X, e.Y));
            Invalidate();
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;
 
            foreach (Point p in myPts)
                g.FillEllipse(Brushes.Firebrick, p.X, p.Y, 10, 10);
 
        }
    }
}
Так вот, вопрос: как сделать так, чтобы рисовалась не точка, а целая куча точек, пока не будет события mouse_up? То есть на mouse_down начать рисовать, отслеживать mouse_move и заполнять всю траекторию движения мыши этими точками, чтобы получилась линия. Знаю что нужно добавить код в обработчики mouse_up и mouse_move, пробовал разные варианты. Не получается. Помогите пожалуйста конкретным кодом в
private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
             //тут походу должен присутствовать Invalidate(); помимо другого кода
        }
и
private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
             //тут походу тоже Invalidate(); чтобы отрисовывать сам процесс создания точек.
        }
Только просьба, List ничем не заменять. Мне важно, чтобы был List или что-то подобное, чтобы знать координаты каждой точки (мне это нужно для определенных целей) И еще вопрос: не будет ли накладно хранить в памяти столько точек? И как можно оптимизировать? Заранее спасибо.

P.S.

Пробовал объявлять булеву переменную, присвоив ей значение false и присваивал ей это значение во всех обработчиках события мыши, кроме mouse_up - здесь присваивал true. В mouse_move делал цикл с проверкой на условие, пока эта переменная не станет true. В цикле пытался добавить точки в коллекцию, но все без толку. Это я делал для того, чтобы начать рисовать на mouse_down и закончить на mouse_up.

Решение задачи: «GDI+ Рисовалка»

textual
Листинг программы
ResizeRedraw = true;
DoubleBuffered = true;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5