Рисование той же формы в том же графическом методе c # - PullRequest
0 голосов
/ 29 августа 2018

Я работал над простым графическим проектом, в котором я могу рисовать фигуры, используя кнопки и редактировать их (изменение размера и другие элементы). Я мог рисовать разные фигуры, но моя проблема в том, что я не могу снова нарисовать ту же форму. Обновляется только параметр предыдущей фигуры.

Например, я попытался нарисовать прямоугольник, а затем хочу снова нарисовать в другом размере, прямоугольник меняет его размер, а не создает новый.

Вот мой код:

Класс формы

class ShapeClass
{
    public int x { get; set; }
    public int y { get; set; }
    public int width { get; set; }
    public int height { get; set; }
    public Pen color { get; set; }
    public string Shape { get; set; }
 }

Класс ничьей

class Draw:ShapeClass
    {
    public void DrawRectangle(PaintEventArgs e)
        {
        e.Graphics.DrawRectangle(color, new Rectangle(x, y, width, height));
    }
    public void DrawSquare(PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(color, new Rectangle(x, y, width, height));
    }
    public void DrawCircle(PaintEventArgs e)
    {
        e.Graphics.DrawEllipse(color, new Rectangle(x,y,width,height));
    }
    public void DrawEllipse(PaintEventArgs e)
    {
        e.Graphics.DrawEllipse(color, new Rectangle(x, y, width, height));
    }

События Paint

    public void PaintRect(object sender, PaintEventArgs e)
    {
        //Calls Draw class and sets the parameters of the Shape.
        Draw d = new Draw();
        d.x = rX;
        d.y = rY;
        d.width = rW;
        d.height = rH;
        rC = new Pen(Color.Red, 2);
        d.color = rC;
        d.DrawRectangle(e);
    }
    public void PaintSquare(object sender, PaintEventArgs e)
    {
        //Calls Draw class and sets the parameters of the Shape.
        Draw d = new Draw();
        d.x = sX;
        d.y = sY;
        d.width = sW;
        d.height = sH;
        d.color = new Pen(Color.Red, 2);
        //d._Rectangle.Add(new Rectangle(sX,sY,sW,sH));
        d.DrawSquare(e);
    }
    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);
    }
    public void PaintEllipse(object sender, PaintEventArgs e)
    {
        //Calls Draw class and sets the parameters of the Shape.
        Draw d = new Draw();
        d.x = eX;
        d.y = eY;
        d.width = eW;
        d.height = eH;
        d.color = new Pen(Color.Red, 2);
        d.DrawEllipse(e);
    }

1 Ответ

0 голосов
/ 29 августа 2018

Давайте на минутку посмотрим на ваш 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... методах.

Почти уверен, что происходит то, что вы настраиваете эти переменные и перерисовываете холст. Это, как правило, стирает существующее содержимое и полностью перерисовывает, что означает, что ваше существующее изображение будет удалено, и ваша «новая» форма будет той, которая нарисована.

Есть несколько способов обойти это:

  1. Сделать изображение постоянным

Вы можете создать System.Drawing.Bitmap объект правильной формы для вашего холста, сделать весь свой рисунок на Bitmap и затем обновить отображение.

Недостатком этого является то, что вы не можете вернуться и изменить существующие объекты, если хотите. После того, как вы рисуете изображение, оно постоянно изменяется с новой формой.

Если вы идете таким образом, вам, вероятно, следует подумать об использовании нескольких Bitmap изображений, чтобы вы могли отменить их, добавив предыдущее изображение из списка. Когда вы начнете операцию рисования, скопируйте текущую Bitmap и поместите копию в список отмены. Чтобы отменить, вытащите последний элемент из этого списка и замените им свой рабочий Bitmap. Не забудьте привести в порядок список отмен, чтобы убедиться, что вы не используете всю память.

  1. Вести список объектов и заново рисовать весь список по мере необходимости

Для этого вам нужно будет построить еще несколько интересных 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...