使用.NET删除矩形?

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

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(); } 

不,你不能“删除”已经绘制的东西。 你可以用别的东西覆盖它,但是使用Graphics对象绘制就像在现实生活中绘画一样:一旦油漆干燥,你只能用另一种颜色绘制它,你不能“擦除”它。

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

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

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

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

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

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

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

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

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

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

代码是自我描述但如果你有任何问题,只需留言……

我认为使用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); }