2010-03-30 62 views
2

我可以删除我绘制的旧矩形并绘制一个新的矩形吗?使用.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(); 
} 
+1

调用panel1.Refresh()。不要直接绘制,请使用Paint事件。 – 2010-03-30 13:02:08

+0

是的,它适合我,非常感谢。 – Dinu 2010-03-30 15:32:28

回答

2

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

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

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

5

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

您可能不应该绘制事物以响应MouseClick。最好是只有为了响应Paint事件而画东西。在这种情况下,我会做的是将一个Rectangle结构添加到MouseClick上的列表中,然后致电panel1.Invalidate()要求它重绘本身。然后在面板的Paint事件中,在那里执行绘图。

这会一箭双雕,因为只需将它们从要绘制的东西中删除即可“抹去”。

0

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

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

0

您可以只使用VisualBasic中的PowerPack,它是随我的版本的Visual Studio 2008

这里是一个示例代码,将绘制一个矩形在一个文本框,即我给它一个定义边框

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

是的,如果你想删除矩形,只需处理控件(矩形或ShapeContainer),没有绘画,没有麻烦! – CandorZ 2010-12-28 15:53:40

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

1

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

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