Давайте на минутку посмотрим на ваш PaintCircle
обработчик событий:
public void PaintCircle(object sender, PaintEventArgs e)
{
//Calls Draw class and sets the parameters of the Shape.
Draw d = new Draw();
d.x = cX;
d.y = cY;
d.width = cW;
d.height = cH;
d.color = new Pen(Color.Red, 2);
d.DrawCircle(e);
}
Довольно прямолинейно, но похоже, что у вас есть набор значений, которые определены один раз в форме: cX
, cY
, cW
и cH
. У вас есть похожие переменные в других Paint...
методах.
Почти уверен, что происходит то, что вы настраиваете эти переменные и перерисовываете холст. Это, как правило, стирает существующее содержимое и полностью перерисовывает, что означает, что ваше существующее изображение будет удалено, и ваша «новая» форма будет той, которая нарисована.
Есть несколько способов обойти это:
- Сделать изображение постоянным
Вы можете создать System.Drawing.Bitmap
объект правильной формы для вашего холста, сделать весь свой рисунок на Bitmap
и затем обновить отображение.
Недостатком этого является то, что вы не можете вернуться и изменить существующие объекты, если хотите. После того, как вы рисуете изображение, оно постоянно изменяется с новой формой.
Если вы идете таким образом, вам, вероятно, следует подумать об использовании нескольких Bitmap
изображений, чтобы вы могли отменить их, добавив предыдущее изображение из списка. Когда вы начнете операцию рисования, скопируйте текущую Bitmap
и поместите копию в список отмены. Чтобы отменить, вытащите последний элемент из этого списка и замените им свой рабочий Bitmap
. Не забудьте привести в порядок список отмен, чтобы убедиться, что вы не используете всю память.
- Вести список объектов и заново рисовать весь список по мере необходимости
Для этого вам нужно будет построить еще несколько интересных Shape
классов.
Вот быстрый пример ...
public abstract class Shape
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public Pen LineColor { get; set; } = Pens.Red;
public Brush FillColor { get; set; } = null;
public abstract void Draw(Graphics g);
}
public class EllipseShape : Shape
{
public override void Draw(Graphics g)
{
if (FillColor != null)
g.FillEllipse(FillColor, X, Y, Width, Height);
g.DrawEllipse(LineColor, X, Y, Width, Height);
}
}
public class RectangleShape : Shape
{
public override void Draw(Graphics g)
{
if (FillColor != null)
g.FillRectangle(FillColor, X, Y, Width, Height);
g.DrawRectangle(LineColor, X, Y, Width, Height);
}
}
... и т. Д.
В вашей основной форме вы можете добавить List<Shape>
для хранения ваших фигур, а затем в событие OnPaint
для холста - независимо от того, какой тип холста вы используете - вы делаете это:
private void MainForm_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
foreach (var shape in shapeList)
shape.Draw(g);
}