我画一个圆窗形式如何在C#窗体中删除绘制的圆形?
Pen pen = new Pen(Color.Black, 3);
Graphics gr = this.CreateGraphics();
gr.DrawEllipse(pen, 5,5,20,20);
如何删除它...
我画一个圆窗形式如何在C#窗体中删除绘制的圆形?
Pen pen = new Pen(Color.Black, 3);
Graphics gr = this.CreateGraphics();
gr.DrawEllipse(pen, 5,5,20,20);
如何删除它...
您可以作废要刷新例如描绘区域:
this.Invalidate();
在表格上...
你要清楚你的图形:
Graphics.Clear();
但是所有的绘制数字将被清除。简而言之,您需要重新绘制除圆圈之外的所有图形。
此外,您还可以使用Invalidate方法:
Control.Invalidate()
它表示一个区域的图形内重绘。但是如果你有相交的数字,你将不得不重新绘制你想要在该区域内可见的图形,除了该圆形。
这可能会变得凌乱,您可能想了解如何设计一个control graph或使用任何图形布局library。
我没有看到什么控制图(又名流程图)与这个问题。 – 2010-11-08 14:38:49
控制图通常以图形布局引擎的构建方式为基础。因此,它可以帮助确定需要绘制或失效的内容。它只是一个开放的主题... – 2010-11-08 14:51:33
有没有Graphics.clear,如果你做图形gr; GR = ....; gr.clear()会给出错误,因为它需要参数,颜色 – barlop 2015-12-08 04:55:45
假设你订阅Paint事件或重写保护的OnPaint程序,那么你将需要执行这样的事情:
bool paint = false;
protected override void OnPaint(object sender, PaintEventArgs e)
{
if (paint)
{
// Draw circle.
}
}
然后,当你想停下来画一个圆圈:
paint = false;
this.Invalidate(); // Forces a redraw
这样做的好处是允许表单重绘它的客户区域。使用Graphics.Clear将用纯色绘制客户区域。 – 2010-11-08 14:19:40
如果一个正方形在圆内并且使圆周围的区域无效,则正方形也将失效。使用这种技术,你将不得不画出你想要看到的区域内的任何东西。 – 2010-11-08 14:20:52
如果您只需将该逻辑放在条件检查之外,并且在要重绘表单时强制失效,那么这很容易完成。 OnPaint逻辑在表单无效时(或整个表单客户区)每次调用。 – 2010-11-08 14:26:58
你不会“删除”它本身,没有什么可以删除的。这是一张图纸,您可以在其上画一些其他东西,或者您可以拨打Graphics.Clear()
method。
你是对的,但是如果他在Paint/OnPaint中绘图,那么他可以简单地包含一个标志来绘制一个圆或者不绘制圆,然后使表单失效。表单的内部逻辑将重绘其没有圈子的客户区域。 – 2010-11-08 14:18:15
您可以使用您控制的背景色相同尺寸的身影在其中您绘制
使用你的代码后清除你的身材。
Pen p = new Pen(this.BackColor);
gr.DrawEllipse(p, 5,5,20,20);
从c中删除绘制的圆圈非常简单。
只有四个步骤: -
如果您使用的是Invalidate()
且无法使用,请拨打panel.Refresh()
。
这会对你有用。
我认为这个评论是解决方案.....无效的面板(窗体,选项卡,......)不是一个好主意....特别是在点击或任何频繁更改事件后需要更改图形时..... – 2017-06-30 17:36:49
事实上,你可以可以删除你的圈子,除了你的圈子。
您需要的所有内容都类似于您想要清除的区域的“之前状态”的屏幕截图,以便从中创建一个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));
要么具有所需颜色使用Graphics.Clear(),使用我张贴作为一个答案的逻辑,或执行this.Invalidate()。最后只会强制表单重新绘制它的客户区,这将有效地删除该圆。 – 2010-11-08 14:23:14
由于您正在使用'this.CreateGraphics',因此您可能没有在Paint事件中绘制该图标。这意味着任何时候你的表单被重新绘制(无论是因为你调用了'Invalidate'方法还是因为Windows发送了一个'WM_PAINT'消息),你的圆将被删除。如果你希望这个圆是半永久的(至少要保持在那里直到你明确地清除它),你需要确保你在你的表单的Paint事件处理器中绘制它,使用在事件的'PaintEventArgs'。 – 2010-11-08 14:37:48
只需最小化窗口并重新恢复。 – 2010-11-08 14:38:39