1.backcolor属性为color.FromArgb(100, 220, 220, 220);
2.全透明设置为transparent方法。
要实现C# WinForm中的控件与背景的透明,可以通过设置控件的BackColor属性为Transparent,同时设置其父控件。因为在C#中,控件的透明指对父窗体透明。
如果不设置Parent属性,那么控件将只对Form透明,显示的时候都会把Form的背景色(默认为Control)重刷一遍作为自己的背景。
在控件比较多的情况下,可以使用Panel控件,将某一组的控件都放到Panel中,然后只对此panel设置背景透明即可,则其他控件都跟着实现了背景透明。
如,现有一PictureBox控件,十多个Label以及Button,那么只将这些Label和Button放入Panel中。同时在Form_Load事件中加入如下代码即可实现背景透明:
this.picturebox1.SendToBack();//将背景图片放到最下面
this.panel1.BackColor = Color.Transparent;//将Panel设为透明
this.panel1.Parent = this.picturebox1;//将panel父控件设为背景图片控件
this.panel1.BringToFront();//将panel放在前面
以上代码即可实现所有的控件都对PictueBox背景图片透明
1.backcolor属性为color.FromArgb(100, 220, 220, 220);
2.全透明设置为transparent方法。
转载于:https://www.cnblogs.com/gaara-zhang/p/9133335.html
前言
由于项目需求需要用到透明控件。但是,winform项目的控件透明都是将父控件的图像绘制成子控件的背景来实现的,这种透明存在很大的问题,不合格。
然后,我想到wpf在透明这块做的比较好,想是不是可以在winform中使用wpf控件来实现,结果发现还是走不通,由于elementhost控件是winform中的控件,而wpf控件必须要用它来承载才能在winform中实现,不合格。
最后,百度发现了使用Region实现透明控件,Region透明控件主要是设置控件的绘制区域来实现的透明控件,所以也不能说是透明控件,只能说是只绘制控件的非透明部分来达到透明的效果,不过基本能够满足我的需求。效果图如下:
最后
这个存在的问题是未绘制区域,就无法触发控件的点击事件,点击的时候会直接点击到后面的控件上。目前没有找到更好的实现方法,之前百度的时候看到有说最好的办法是使用directx重写控件,不过这个方法对本人来说有点复杂了。如果大家有更好的实现方法,欢迎交流。
最新做一个项目,使用的是Winform,碰到一个问题,需要在后台执行某项任务的时候,画面显示“处理中”这样的半透明遮罩,Web项目中可以使用DIV(Css半透明),或者Wpf项目的话本身控件支持真透明(直接与DirectX进行交互),而Winform本身控件并不支持真正的透明,经过各种调查还是没有解决这个问题。
在网上查到的结果主要有两种。
1.指定ControlStyles。
// 摘要: // 指定控件的样式和行为。 [Flags] public enum ControlStyles { ... // 摘要: // 如果为 true,则控件被绘制为不透明的,不绘制背景。 Opaque = 4, // // 摘要: // 如果为 true,控件接受 alpha 组件小于 255 的 System.Windows.Forms.Control.BackColor 以模拟透明。仅在 // System.Windows.Forms.ControlStyles.UserPaint 位设置为 true 并且父控件派生自 System.Windows.Forms.Control // 时才模拟透明。 SupportsTransparentBackColor = 2048 ... }
在控件的构造函数中,指定样式。
public MyControl { SetStyle(ControlStyles.Opaque | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); }
其中Opaque代表强制不画背景,
剩下的AllPaintingInWmPaint和UserPaint只是为了增强描画的效率。
当然如果为了实现自己的效果,还需要重写描画函数。
/// <summary> /// 自定义绘制窗体 /// </summary> /// <param name="e"></param> protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { float vlblControlWidth; float vlblControlHeight; Pen labelBorderPen; SolidBrush labelBackColorBrush; Color drawColor = Color.FromArgb(this._alpha, Color.Black); labelBorderPen = new Pen(drawColor, 0); labelBackColorBrush = new SolidBrush(drawColor); vlblControlWidth = this.Size.Width; vlblControlHeight = this.Size.Height; e.Graphics.DrawRectangle(labelBorderPen, 0, 0, vlblControlWidth, vlblControlHeight); e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, vlblControlWidth, vlblControlHeight); base.OnPaint(e); }
到此为止,程序运行的效果如下:
为了显示出控件的透明效果,透明度被固定的设置为了125,背景色为黑色,在这招下面放了2个按钮,OK,看起来很完美。但是。。。因为强制不描绘,如果使用Alt + Tab进行画面切换的话。。。,就变成了以下这个样子。。。
嗯?你问我这个是什么?没错,这个就是刚才的那个半透明遮罩,我只不过用Alt + tab切换到了Visual Studio, 然后又切换回来而已。在切换到Alt + tab之后,切换到Visual Studio的时候画面背景进行了重画(指的VisualStudio的窗口),这个之后,再次切换回Form1,由于强制控件不描画背景,就变成了上面的这个样子。不要告诉我“那你不要切换画面就好了”,反正我做不到。
还有上面写道的ControlStyles里面有一个SupportsTransparentBackColor,在控件构造函数中指定,并且将控件的BackGroundColor设置成Transparent,控件只是得到了支持父容器的透明,简单说,如果父容器中没有其他控件的话,可以得到透明效果,但是,如果父容器中含有其他的控件,就会失去透明效果,也可以说这是一种“假透明”。
2.重写CreateParams
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; // 开启 WS_EX_TRANSPARENT,使控件透明 cp.ExStyle |= 0x20; return cp; } }
这个其实和1方法是大同小异, 个人觉得还不如第一个,也许是因为考虑不够周全,使用这种办法实现透明的时候,不仅在1中提到的问题没有得到解决,并且在拖动时还会有边界阴影的问题。
综上所述,我没有找到根本的解决控件透明的解决办法,社区里面的各位高手,如果您已经解决了上述的问题,或者您
转载于:https://my.oschina.net/u/2966716/blog/760603