如何创建一个透明控件,在其他控件之上工作?我有一个控件(派生自System.Windows.Forms.Control)需要在某些方面是透明的。我已经使用SetStyle()实现了这个:publicTransparentControl(){SetStyle(ControlStyles.SupportsTransparentBackColor,true);this.BackColor=Color.Transparent.现在,如果表单和透明控件之间没有控件,则此方法有效。但是,如果透明控件下面恰好有另一个控件(此处用例),则它不起作用。中间控件未绘制,但显示下表。我可以通过覆盖CreateParams并设置WS_EX_TRANSPARENTflashg来获得我需要的效果:cp.ExStyle|=0x20;//WS_EX_TRANSPARENT返回cp;}}这里的问题是它确实减慢了控件的绘制速度。控件已经是双缓冲的,所以没什么可做的。性能损失非常严重,无法接受。还有其他人遇到过这个问题吗?我能找到的所有资源都建议方法#1,但同样,这在我的情况下不起作用。编辑:我应该注意到我有一个解决方法。子(透明)控件可以简单地将自己绘制到父控件的Graphics对象上,但它实际上很笨拙,我根本不喜欢这种解决方案(尽管我可能就是这样)。编辑2:因此,根据我关于.NET透明度如何工作的建议,我在我的用户控件中实现了IContainer接口,其中包含透明控件。我创建了一个实现ISite的类,我将我的子控件添加到UserControl的Components集合中,Container属性在调试器中正确排列,但我仍然没有得到透明效果。有人有什么想法吗?这只是我编写的一个简单的东西..我发现的唯一问题是当相交控件更新时它不会更新..它通过绘制一个位于当前控件后面/与位图相交的控件来工作,然后绘制这个位图到当前控件。protectedoverridevoidOnPaint(PaintEventArgse){if(Parent!=null){Bitmapbehind=newBitmap(Parent.Width,Parent.Height);foreach(ControlcinParent.Controls)if(c.Bounds.IntersectsWith(this.Bounds)&c!=this)c.DrawToBitmap(behind,c.Bounds);e.Graphics.DrawImage(后面,-左,-上);背后.Dispose();DotNet中的透明控件是通过让透明控件的容器在透明控件的窗口中自然绘制,然后让透明控件自己绘制来实现的。此程序未考虑重叠控制的可能性。所以你需要使用某种变通方法来让它工作。在某些情况下,我在复杂嵌套方面取得了成功,但这主要只适用于位图的快速分层,并且不能解决部分重叠控件的任何问题。我发现以下修改使事情变得更快:if((this.BackColor==Color.Transparent)&&(Parent!=null)){foreach(Parent.Controls中的控制c){if(c!=this&&c.Bounds.IntersectsWith(this.Bounds)){c.DrawToBitmap(behind,c.Bounds);}}e.Graphics.DrawImage(后面,-Left,-Top);背后.Dispose();我还认为使用this.Width/this.Height而不是Parent.Width/Parent.Height会更快,但我没有时间去修补它。绘制受控制的兄弟姐妹是可能的,但它很难看。下面的代码对我来说效果很好,它扩展了EdS.链接中给出的代码。回答。可能的陷阱:这是代码:if(Parent!=null){floattx=-Left,ty=-Top;//如果您的控件//有非客户区、边框或类似内容,请在此处调整tx和tye.Graphics.TranslateTransform(tx,ty);使用(PaintEventArgspea=newPaintEventArgs(e.Graphics,e.ClipRectangle)){InvokePaintBackground(Parent,pea);InvokePaint(父母,豌豆);}e.Graphics.TranslateTransform(-tx,-ty);//遍历我们自己下的父级的子级intstart=Parent.Controls.GetChildIndex(this);矩形rect=newRectangle(Left,Top,Width,Height);for(inti=Parent.Controls.Count-1;i>start;i--){Controlc=Parent.Controls[i];//跳过...//...不可见控件//...或宽度/高度为零的控件(自动调整没有内容的标签!)//...或不与我们自己相交的控件if(!c.Visible||c.Width==0||c.Height==0||!rect.IntersectsWith(newRectangle(c.Left,c.Top,c.Width,c.Height)))continue;使用(Bitmapb=newBitmap(c.Width,c.Height,e.Graphics)){c.DrawToBitmap(b,newRectangle(0,0,c.Width,c.Height));tx=c.Left-左;ty=c.Top-顶部;//如果您的控件//有非客户区、边框或类似内容,请在此处调整tx和tye.Graphics.TranslateTransform(tx,ty);e.Graphics.DrawImageUnscaled(b,newPoint(0,0));e.Graphics.TranslateTransform(-tx,-ty);我决定在父控件下手动绘制父级Hereisagoodarticle。一些建议。为VB代码道歉。尽量避免绘制背景:ProtectedOverridesSubWndProc(ByRefmAsSystem.Windows.Forms.Message)Ifm.Msg=&H14ThenReturnEndIfMyBase.WndProc(m)EndSubProtectedOverridesSubOnPaintBackground(ByValpeventAsSystem.Windows.Forms.PaintEventArgs)ReturnEndSubDon'tcallthecontrolbasepaintmethod:ProtectedOverridesSubOnPaint(ByValeAsSystem.Windows.Forms.PaintEventArgs)'MyBase.OnPaint(e)-注释掉-不要调用EndSub这就是诀窍,至少对我有用:以上是C#学习教程:如何创建一个工作在其他控件之上的透明控件?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——protectedoverridevoidOnPaintBackground(PaintEventArgse){//base.OnPaintBackground(e);这个.CreateGraphics()。DrawRectangle(newPen(Color.Transparent,1),newRectangle(0,0,this.Size.Width,this.Size.Height));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
