使用.NET删除矩形?

时间:2010-03-30 05:50:53

标签: c# .net graphics

我可以删除我绘制的旧矩形并绘制一个新矩形吗?

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 个答案:

答案 0 :(得分:5)

不,你不能“删除”已经绘制的东西。你可以用其他东西覆盖它,但用Graphics物体绘画就像在现实生活中画画一样:一旦油漆干了,你只能用另一种颜色在上面画画,你可以“删除”它。

你可能不应该为了回应MouseClick而绘制东西。最好绘制事物以响应Paint事件。在这种情况下我要做的是在MouseClick上的列表中添加Rectangle结构,然后调用panel1.Invalidate()让它重绘自己。然后在面板的Paint事件中,在那里进行绘图。

这将一石二鸟,因为你可以通过简单地将它们从要绘制的东西列表中删除来“擦除”。

答案 1 :(得分:2)

这通常通过维护您想要绘制的对象集合来完成。鼠标单击应更新此集合,然后告诉窗口(或影响区域)刷新。如果窗口移出屏幕,隐藏在其他窗口后面,最小化等,这具有保留您绘制的任何内容的巨大优势。

对于基本解决方案,创建从公共抽象Shape类派生的可绘制形状类型的层次结构,并使用例如集合的List。基础Shape类将具有派生类重写的抽象Draw方法。

对于更具工业强度的解决方案,请浏览二维场景图。

答案 2 :(得分:1)

可以使用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

答案 3 :(得分:1)

此外,根据应用程序的不同,您可能会看到使用DrawReversibleFrame。您可以通过调用Offset方法更改矩形位置。

答案 4 :(得分:0)

而不是调用g.DrawRectangle(pen,100,100,100,200); ,将矩形保持为将由图形对象绘制的对象。每次用新的矩形对象更新这个矩形对象时,图形对象都会绘制新的矩形对象。

刷新应清除旧矩形,图形将绘制新矩形。

答案 5 :(得分:0)

你可以使用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()

代码是自我描述的,但如果您有任何问题,请留言......

答案 6 :(得分:0)

我认为使用DrawReversibleFrame是正确的解决方案。 第一个调用绘制矩形,第二个调用绘制它,依此类推。

下面是一个示例代码,按钮上的clic将使矩形显示/消失。

Rectangle pRect = new Rectangle(10, 10, 20, 20);
private void rect_Click(object sender, EventArgs e)
{
  ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick);
}