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