如何删除c#windows窗体中的绘制圆?

Gen*_*ius 7 c# graphics

我在Windows窗体中画了一个圆圈

Pen pen = new Pen(Color.Black, 3);
Graphics gr = this.CreateGraphics();
gr.DrawEllipse(pen, 5,5,20,20);
Run Code Online (Sandbox Code Playgroud)

如何删除它...

Céd*_*tte 17

你必须清除你的图形:

Graphics.Clear();
Run Code Online (Sandbox Code Playgroud)

但所有绘制的数字都将被清除.简单地说,您将需要重绘除圆圈之外的所有数字.

此外,您可以使用Invalidate方法:

Control.Invalidate()
Run Code Online (Sandbox Code Playgroud)

它表示要在Graphics中重绘的区域.但是如果你有交叉的数字,你将不得不重绘你想要在除圆圈之外的区域内可见的数字.

这可能会变得混乱,您可能想要查看如何设计控件图或使用任何图形布局.

  • 没有Graphics.clear,如果你做Graphics gr; GR = ....; gr.clear()它给出了一个错误,因为它需要一个参数,一个颜色 (2认同)

shi*_*hin 11

您可以使要刷新的绘图区域无效,例如:

 this.Invalidate();
Run Code Online (Sandbox Code Playgroud)

在表格上......


Chr*_*son 6

假设您正在订阅Paint事件或覆盖受保护的OnPaint例程,那么您将需要执行以下操作:

bool paint = false;

protected override void OnPaint(object sender, PaintEventArgs e)
{
  if (paint) 
  {
   // Draw circle.
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,当你想停止画圆圈时:

paint = false;
this.Invalidate(); // Forces a redraw
Run Code Online (Sandbox Code Playgroud)


小智 5

事实上,您可以删除自己的圈子,但只能删除自己的圈子。

您需要的一切都类似于您想要清除的区域的“之前状态”的屏幕截图,以便从中制作TextureBrush。您可以通过以下方式实现该步骤:

Bitmap _Background = new Bitmap(this.Width, this.Height);
Graphics.FromImage(_Background).CopyFromScreen(this.Left, this.Top, 0, 0, this.Size);
Run Code Online (Sandbox Code Playgroud)

第一行将为您提供 Windows 窗体大小的位图。第二行将在位_Background图中保存它的屏幕截图。

现在你用TextureBrush它创建一个:

Brush brsBackground = new TextureBrush(_Background);
Run Code Online (Sandbox Code Playgroud)

接下来您需要的是圆的尺寸,因此如果它们不是固定值,则应该将它们保存到变量中。当你拿到它们时,你可以像这样清理特定区域:

Graphics gr = this.CreateGraphics();
gr.FillEllipse(brsBackground, 5, 5, 20, 20); // values referred to your example
Run Code Online (Sandbox Code Playgroud)

完毕!

即使是复杂的数字也可以通过此删除,例如GraphicsPath

GraphicsPath gp = new GraphicsPath(); // any kind of GraphicsPath
gr.FillRegion(brsBackground, new Region(gp));
Run Code Online (Sandbox Code Playgroud)