Вы должны создать контейнер, который может ссылаться на коллекцию точек и добавлять одну точку в коллекцию каждый раз, когда вы нажимаете на элемент управления, способный рисовать.
Возможно, вы также хотите создать другойвиды рисования точки , основанные на некоторых условиях или требованиях.
Таким образом, вам необходимо хранить и эти дополнительные свойства, а не только координаты точки.
Если это так, вам нужен специализированный объект, которыйможет предоставить эти свойства при необходимости.
Итак, вот пользовательский объект Class
с некоторыми простыми свойствами, который позволяет вам определить цвет и размер точки.Для каждой из его коллекции Points.
Он также реализует интерфейс IDisposable
, поскольку нам необходимо создать объект Pen
для каждой нарисованной точки.И объект Pen
должен быть удален (реализует IDisposable
).
Чтобы выполнить рисование, вам просто нужно вызвать Control.Invalidate()
(pictureBox1.Invalidate()
в примере).Это вызывает перерисовку недействительных частей элемента управления, вызывая событие OnPaint()
.
Каждая точка (которую необходимо перекрасить) рисуется с помощью e.Graphics.DrawEllipse()
Вы можете проверить это следующим образом:
С предопределенными свойствами, используя только координату указателя мыши:
myPoints.Add(new MyPoints.DrawingPoint(e.Location));
С определенными свойствами, когда требуется что-то другое:
С размером 8x8 пикселей
newPoint.Dot = new Rectangle(e.Location, new Size(8, 8)));
С оранжевой ручкой размером 2 пикселя
newPoint.DrawingPen = new Pen(Color.Orange, 2);
Добавитьэтот новый Указатель на коллекцию
myPoints.DrawingPoints.Add(newPoint);
РЕДАКТИРОВАТЬ:
Добавление метода Clear()
к основному объекту, используетсяDispose()
текущий список очков и создать новый пустой список:
MyPoints.Clear();
Пример реализации:
MyPoints myPoints = new MyPoints();
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//Use default property values
//myPoints.Add(new MyPoints.DrawingPoint(e.Location));
MyPoints.DrawingPoint newPoint = new MyPoints.DrawingPoint();
newPoint.Dot = new Rectangle(e.Location, new Size(4, 4));
newPoint.DrawingPen = new Pen(Color.Red, 2);
myPoints.DrawingPoints.Add(newPoint);
((Control)sender).Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
foreach (MyPoints.DrawingPoint mypoint in myPoints.DrawingPoints) {
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawEllipse(mypoint.DrawingPen, mypoint.Dot);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myPoints.Dispose();
}
Контейнер класса объектов Point:
internal class MyPoints : IDisposable
{
bool IsDisposed = false;
public MyPoints() => DrawingPoints = new List<DrawingPoint>();
public List<DrawingPoint> DrawingPoints { get; set; }
public void Add(DrawingPoint NewPoint)
{
if (NewPoint.Dot.Size.Width > 1 && NewPoint.Dot.Size.Height > 1)
DrawingPoints.Add(NewPoint);
}
public void Clear()
{
this.Dispose();
this.DrawingPoints.Clear();
this.DrawingPoints = new List<DrawingPoint>();
}
public void Remove(Point point)
{
Remove(this.DrawingPoints.Select((p, i) => { if (p.Dot.Contains(point)) return i; return -1; }).First());
}
public void Remove(int Index)
{
if (Index > -1)
{
this.DrawingPoints[Index].Delete();
this.DrawingPoints.RemoveAt(Index);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool IsSafeDisposing)
{
if (IsSafeDisposing && (!this.IsDisposed) && (this.DrawingPoints.Count > 0))
{
foreach (DrawingPoint dp in this.DrawingPoints)
if (dp != null) dp.Delete();
}
}
public class DrawingPoint
{
Pen m_Pen = null;
Rectangle m_Dot = Rectangle.Empty;
public DrawingPoint() : this(Point.Empty) { }
public DrawingPoint(Point newPoint)
{
this.m_Pen = new Pen(Color.Red, 1);
this.m_Dot = new Rectangle(newPoint, new Size(2, 2));
}
public Pen DrawingPen { get => this.m_Pen; set => this.m_Pen = value; }
public Rectangle Dot { get => this.m_Dot; set => this.m_Dot = value; }
public void Delete()
{
if (this.m_Pen != null) this.m_Pen.Dispose();
}
}
}
Вот как он может работать, изменяя свои свойства при необходимости:
![DottedColors1](https://i.stack.imgur.com/KD7Q7.gif)