Удалить прямоугольник с помощью .NET? - PullRequest
2 голосов
/ 30 марта 2010

Можно ли удалить старый нарисованный прямоугольник и нарисовать новый прямоугольник?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
        Graphics g = this.panel1.CreateGraphics();
        Pen pen = new Pen(Color.Black, 2);

        g.DrawRectangle(pen, 100,100, 100, 200);
        g.dispose();
}

Ответы [ 7 ]

5 голосов
/ 30 марта 2010

Нет, вы не можете "удалить" то, что уже нарисовано. Вы можете перезаписать это чем-то другим, но рисование с Graphics объектами похоже на рисование в реальной жизни: если краска высохнет, вы можете закрасить ее только другим цветом, вы не сможете стереть "это.

Вы, вероятно, не должны рисовать вещи в ответ на MouseClick, либо. Лучше всего только рисовать вещи в ответ на Paint событие. В этой ситуации я бы добавил структуру Rectangle в список на MouseClick и затем вызвал panel1.Invalidate(), чтобы попросить его перерисовать себя. Затем в событии Paint для панели сделайте чертеж там.

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

2 голосов
/ 30 марта 2010

Обычно это делается путем сохранения набора объектов, которые вы хотите нарисовать. Щелчок мыши должен обновить эту коллекцию, а затем сообщить окну (или области воздействия), что нужно обновить. Это имеет огромное преимущество - сохранить все, что вы нарисовали, если окно перемещено за экран, скрыто за другими окнами, свернуто и т. Д.

В качестве элементарного решения создайте иерархию доступных для рисования типов фигур, полученных из общего абстрактного класса Shape, и используйте, например, список для коллекции. Базовый класс Shape будет иметь абстрактный метод Draw, который переопределяют производные классы.

Чтобы получить более промышленное решение, посмотрите на двухмерные графы сцен.

1 голос
/ 31 марта 2015

Кроме того, в зависимости от приложения вы можете использовать DrawReversibleFrame. Вы можете изменить местоположение прямоугольника, вызвав метод Offset.

1 голос
/ 04 апреля 2012

Для этого можно использовать методы Graphics.Save() и Graphics.Restore(state). Например:

private void SaveRestore2(PaintEventArgs e)
{
    // Translate transformation matrix.
    e.Graphics.TranslateTransform(100, 0);

    // Save translated graphics state.
    GraphicsState transState = e.Graphics.Save();

    // Reset transformation matrix to identity and fill rectangle.
    e.Graphics.ResetTransform();
    e.Graphics.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100);

    // Restore graphics state to translated state and fill second

    // rectangle.
    e.Graphics.Restore(transState);
    e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 0, 0, 100, 100);
}

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.restore.aspx

0 голосов
/ 18 ноября 2016

Я думаю, что использование DrawReversibleFrame является правильным решением. Первый вызов рисует прямоугольник, второй вызов отменяет его и т. Д.

Вот пример кода, нажатие на кнопку заставит прямоугольник появляться / исчезать.

Rectangle pRect = new Rectangle(10, 10, 20, 20);
private void rect_Click(object sender, EventArgs e)
{
  ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick);
}
0 голосов
/ 28 декабря 2010

Вы можете просто использовать VisualBasic PowerPacks, он входит в мою версию Visual Studio 2008

Вот пример кода, который будет рисовать прямоугольник над TextBox, т. Е. Я даю ему настраиваемую границу

    Dim x = TextBox1.Location.X
    Dim y = TextBox1.Location.Y
    Dim width = TextBox1.Width
    Dim height = TextBox1.Height
    Dim ShapeContainer1 As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
    Me.Controls.Add(ShapeContainer1)
    Dim RectangleShape1 As New Microsoft.VisualBasic.PowerPacks.RectangleShape
    ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {RectangleShape1})
    RectangleShape1.Location = New System.Drawing.Point(x - 1, y - 1)
    RectangleShape1.Size = New System.Drawing.Size(width + 1, height + 1)
    RectangleShape1.BorderColor = Color.MistyRose
    ShapeContainer1.Refresh()

Код самоописывается, но если у вас возникнут проблемы, просто оставьте сообщение ...

0 голосов
/ 31 марта 2010

Вместо вызова g.DrawRectangle (ручка, 100,100, 100, 200); , сохраните прямоугольник как объект, который будет нарисован графическим объектом. Каждый раз, когда вы будете обновлять этот прямоугольный объект новым, графический объект будет рисовать новый.

Обновление должно очистить старый прямоугольник, а графика нарисует новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...