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;