2009-10-22 50 views
6

所以,我很不熟悉windows窗体开发。如何清除窗体中透明控件上的图形

我试图创建一个“嘿,我忙于做东西”组件,只是旋转一个形状。我想这个控件是暂时的,并且在任何其他控件的顶部。该类直接从Control继承。

所以我有这样的构造:

SetStyle(ControlStyles.Opaque, true); 

这:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams parms = base.CreateParams; 
     parms.ExStyle |= 0x20; 
     return parms; 
    } 
} 

它得到我,将借鉴其他控件的顶部的控制。

现在我的问题是这样的。我每秒钟重画控制几次,给予平稳动画的外观。但是,我无法弄清楚如何清除前一帧中绘制的内容。使用OnPaint中的e.Graphics.Clear(Color.Transparent)将整个控件变成黑色。

有没有办法清除控件的绘制内容?

我注意到调整控件大小将清除背景。

事情,不工作

  1. 重写OnPaintBackground什么也不做。或者只需调用base.OnPaintBackground。相同的结果。

回答

4

好吧,我发现这里的解决方案: http://www.bobpowell.net/transcontrols.htm

家长控制实际上必须以保留透明背景无效。

+1

您不必使整个父控件无效,而只是对应于用户控件的区域:this.Parent.Invalidate(this.ClientRectangle,true); – 2010-04-12 00:39:59

+0

@Eric:谢谢你的提示。我想我可能已经做到了! – snicker 2010-04-12 15:13:46

+1

除非用户控件位于位置(0,0),否则这将无法正常工作。您必须使usercontrol覆盖的父区域失效并使用父坐标。另外,如果usercontrol具有透明的非客户区域,则该区域也不会失效。我会去'this.Parent.Invalidate(new Rectangle(this.Location,this.Size),true);' – takrl 2011-04-21 09:23:55

2

您可能要重写OnPaintBackground本文介绍:http://saftsack.fs.uni-bayreuth.de/~dun3/archives/creating-a-transparent-panel-in-net/108.html

您可能还需要使控制无效,当需要清除强制OnPaintBackground被调用它。

+0

这不能解决问题。我之前无效的控制权。不过谢谢。 – snicker 2009-10-22 20:20:09

+0

但我确实在该页面的评论中找到了真正解决方案的链接,因此+1和谢谢。 – snicker 2009-10-22 20:31:00

+0

并非每个控件都可以覆盖onpaintbackground,就像工具提示 – Mike 2015-07-20 02:40:23