GDI+ Рисовалка - C#
Формулировка задачи:
Доброго времени суток.
Ради интереса пробую по учебнику работать с GDI+.
Следующий код рисует точку по нажатию клавиши мыши. Все точки добавляются в List<>:
Так вот, вопрос: как сделать так, чтобы рисовалась не точка, а целая куча точек, пока не будет события mouse_up? То есть на mouse_down начать рисовать, отслеживать mouse_move и заполнять всю траекторию движения мыши этими точками, чтобы получилась линия. Знаю что нужно добавить код в обработчики mouse_up и mouse_move, пробовал разные варианты. Не получается. Помогите пожалуйста конкретным кодом в
и
Только просьба, List ничем не заменять. Мне важно, чтобы был 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); } } }
private void Form1_MouseUp(object sender, MouseEventArgs e) { //тут походу должен присутствовать Invalidate(); помимо другого кода }
private void Form1_MouseMove(object sender, MouseEventArgs e) { //тут походу тоже Invalidate(); чтобы отрисовывать сам процесс создания точек. }
P.S.
Пробовал объявлять булеву переменную, присвоив ей значение false и присваивал ей это значение во всех обработчиках события мыши, кроме mouse_up - здесь присваивал true. В mouse_move делал цикл с проверкой на условие, пока эта переменная не станет true. В цикле пытался добавить точки в коллекцию, но все без толку. Это я делал для того, чтобы начать рисовать на mouse_down и закончить на mouse_up.Решение задачи: «GDI+ Рисовалка»
textual
Листинг программы
ResizeRedraw = true; DoubleBuffered = true;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д