2010-11-08 143 views
6

我画一个圆窗形式如何在C#窗体中删除绘制的圆形?

Pen pen = new Pen(Color.Black, 3); 
Graphics gr = this.CreateGraphics(); 
gr.DrawEllipse(pen, 5,5,20,20); 

如何删除它...

+0

要么具有所需颜色使用Graphics.Clear(),使用我张贴作为一个答案的逻辑,或执行this.Invalidate()。最后只会强制表单重新绘制它的客户区,这将有效地删除该圆。 – 2010-11-08 14:23:14

+0

由于您正在使用'this.CreateGraphics',因此您可能没有在Paint事件中绘制该图标。这意味着任何时候你的表单被重新绘制(无论是因为你调用了'Invalidate'方法还是因为Windows发送了一个'WM_PAINT'消息),你的圆将被删除。如果你希望这个圆是半永久的(至少要保持在那里直到你明确地清除它),你需要确保你在你的表单的Paint事件处理器中绘制它,使用在事件的'PaintEventArgs'。 – 2010-11-08 14:37:48

+0

只需最小化窗口并重新恢复。 – 2010-11-08 14:38:39

回答

10

您可以作废要刷新例如描绘区域:

this.Invalidate(); 

在表格上...

15

你要清楚你的图形:

Graphics.Clear(); 

但是所有的绘制数字将被清除。简而言之,您需要重新绘制除圆圈之外的所有图形。

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

Control.Invalidate() 

它表示一个区域的图形内重绘。但是如果你有相交的数字,你将不得不重新绘制你想要在该区域内可见的图形,除了该圆形。

这可能会变得凌乱,您可能想了解如何设计一个control graph或使用任何图形布局library

+0

我没有看到什么控制图(又名流程图)与这个问题。 – 2010-11-08 14:38:49

+0

控制图通常以图形布局引擎的构建方式为基础。因此,它可以帮助确定需要绘制或失效的内容。它只是一个开放的主题... – 2010-11-08 14:51:33

+2

有没有Graphics.clear,如果你做图形gr; GR = ....; gr.clear()会给出错误,因为它需要参数,颜色 – barlop 2015-12-08 04:55:45

5

假设你订阅Paint事件或重写保护的OnPaint程序,那么你将需要执行这样的事情:

bool paint = false; 

protected override void OnPaint(object sender, PaintEventArgs e) 
{ 
    if (paint) 
    { 
    // Draw circle. 
    } 
} 

然后,当你想停下来画一个圆圈:

paint = false; 
this.Invalidate(); // Forces a redraw 
+0

这样做的好处是允许表单重绘它的客户区域。使用Graphics.Clear将用纯色绘制客户区域。 – 2010-11-08 14:19:40

+0

如果一个正方形在圆内并且使圆周围的区域无效,则正方形也将失效。使用这种技术,你将不得不画出你想要看到的区域内的任何东西。 – 2010-11-08 14:20:52

+0

如果您只需将该逻辑放在条件检查之外,并且在要重绘表单时强制失效,那么这很容易完成。 OnPaint逻辑在表单无效时(或整个表单客户区)每次调用。 – 2010-11-08 14:26:58

2

你不会“删除”它本身,没有什么可以删除的。这是一张图纸,您可以在其上画一些其他东西,或者您可以拨打Graphics.Clear()method

+0

你是对的,但是如果他在Paint/OnPaint中绘图,那么他可以简单地包含一个标志来绘制一个圆或者不绘制圆,然后使表单失效。表单的内部逻辑将重绘其没有圈子的客户区域。 – 2010-11-08 14:18:15

2

您可以使用您控制的背景色相同尺寸的身影在其中您绘制

使用你的代码后清除你的身材。

Pen p = new Pen(this.BackColor); 
gr.DrawEllipse(p, 5,5,20,20); 
-4

从c中删除绘制的圆圈非常简单。

只有四个步骤: -

  1. 打开涡轮增压应用
  2. 进入命令,你画了圈
  3. 拖动命令
  4. 点击删除按钮
2

如果您使用的是Invalidate()且无法使用,请拨打panel.Refresh()

这会对你有用。

+0

我认为这个评论是解决方案.....无效的面板(窗体,选项卡,......)不是一个好主意....特别是在点击或任何频繁更改事件后需要更改图形时..... – 2017-06-30 17:36:49

0

事实上,你可以可以删除你的圈子,除了你的圈子。

您需要的所有内容都类似于您想要清除的区域的“之前状态”的屏幕截图,以便从中创建一个TextureBrush。你可以通过这样的事情实现这一步:

Bitmap _Background = new Bitmap(this.Width, this.Height); 
Graphics.FromImage(_Background).CopyFromScreen(this.Left, this.Top, 0, 0, this.Size); 

第一行会给你一个位图在你的Windows窗体大小。第二行将保存在_Background -bitmap中的截图。

现在你创建一个TextureBrush出来的:

Brush brsBackground = new TextureBrush(_Background); 

你需要接下来的事情是你圈的尺寸,所以你应该把它们保存到一个变量,如果他们不是一个固定值。当你手头有他们,你可以清除特定的区域是这样的:

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

完成!

即使是复杂的数字是能够通过该被删除,像GraphicsPath例如:

GraphicsPath gp = new GraphicsPath(); // any kind of GraphicsPath 
gr.FillRegion(brsBackground, new Region(gp));