1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C#实现Winform自定义半透明遮罩层

C#实现Winform自定义半透明遮罩层

时间:2021-10-19 17:33:07

相关推荐

C#实现Winform自定义半透明遮罩层

在网页中通过div+css实现半透明效果不难,今天我们看看一种在winfrom中实现的方法:

效果图如下,正常时:

显示遮罩层时:

自定义遮罩层控件的源码如下:

View Code

using System;using System.Drawing;using System.Windows.Forms;using ponentModel;namespace MyOpaqueLayer{/// <summary>/// 自定义控件:半透明控件/// </summary>/* * [ToolboxBitmap(typeof(MyOpaqueLayer))]* 用于指定当把你做好的自定义控件添加到工具栏时,工具栏显示的图标。* 正确写法应该是* [ToolboxBitmap(typeof(XXXXControl),"xxx.bmp")]* 其中XXXXControl是你的自定义控件,"xxx.bmp"是你要用的图标名称。*/[ToolboxBitmap(typeof(MyOpaqueLayer))]public class MyOpaqueLayer : System.Windows.Forms.Control{private bool _transparentBG = true;//是否使用透明private int _alpha = 125;//设置透明度private ponentModel.Container components = new ponentModel.Container();public MyOpaqueLayer(): this(125, true){}public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage){SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);base.CreateControl();this._alpha = Alpha;if (IsShowLoadingImage){PictureBox pictureBox_Loading = new PictureBox();pictureBox_Loading.BackColor = System.Drawing.Color.White;pictureBox_Loading.Image = 加载中.Properties.Resources.loading; pictureBox_Loading.Name = "pictureBox_Loading";pictureBox_Loading.Size = new System.Drawing.Size(48, 48);pictureBox_Loading.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;Point Location = new Point(this.Location.X + (this.Width - pictureBox_Loading.Width) / 2, this.Location.Y + (this.Height - pictureBox_Loading.Height) / 2);//居中pictureBox_Loading.Location = Location;pictureBox_Loading.Anchor = AnchorStyles.None;this.Controls.Add(pictureBox_Loading);}}protected override void Dispose(bool disposing){if (disposing){if (!((components == null))){components.Dispose();}}base.Dispose(disposing);}/// <summary>/// 自定义绘制窗体/// </summary>/// <param name="e"></param>protected override void OnPaint(System.Windows.Forms.PaintEventArgs e){float vlblControlWidth;float vlblControlHeight;Pen labelBorderPen;SolidBrush labelBackColorBrush;if (_transparentBG){Color drawColor = Color.FromArgb(this._alpha, this.BackColor);labelBorderPen = new Pen(drawColor, 0);labelBackColorBrush = new SolidBrush(drawColor);}else{labelBorderPen = new Pen(this.BackColor, 0);labelBackColorBrush = new SolidBrush(this.BackColor);}base.OnPaint(e);vlblControlWidth = this.Size.Width;vlblControlHeight = this.Size.Height;e.Graphics.DrawRectangle(labelBorderPen, 0, 0, vlblControlWidth, vlblControlHeight);e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, vlblControlWidth, vlblControlHeight);}protected override CreateParams CreateParams//v1.10 {get{CreateParams cp = base.CreateParams;cp.ExStyle |= 0x00000020; //0x20; // 开启 WS_EX_TRANSPARENT,使控件支持透明return cp;}}/** [Category("myOpaqueLayer"), Description("是否使用透明,默认为True")]* 一般用于说明你自定义控件的属性(Property)。* Category用于说明该属性属于哪个分类,Description自然就是该属性的含义解释。*/[Category("MyOpaqueLayer"), Description("是否使用透明,默认为True")]public bool TransparentBG{get{return _transparentBG;}set{_transparentBG = value;this.Invalidate();}}[Category("MyOpaqueLayer"), Description("设置透明度")]public int Alpha{get{return _alpha;}set{_alpha = value;this.Invalidate();}}}}

OpaqueCommand的方法:ShowOpaqueLayer(显示遮罩层)和HideOpaqueLayer(隐藏遮罩层)

View Code

using System;using System.Windows.Forms;namespace 加载中{class OpaqueCommand{private MyOpaqueLayer.MyOpaqueLayer m_OpaqueLayer = null;//半透明蒙板层/// <summary>/// 显示遮罩层/// </summary>/// <param name="control">控件</param>/// <param name="alpha">透明度</param>/// <param name="isShowLoadingImage">是否显示图标</param>public void ShowOpaqueLayer(Control control, int alpha, bool isShowLoadingImage){try{if (this.m_OpaqueLayer == null){this.m_OpaqueLayer = new MyOpaqueLayer.MyOpaqueLayer(alpha, isShowLoadingImage);control.Controls.Add(this.m_OpaqueLayer);this.m_OpaqueLayer.Dock = DockStyle.Fill;this.m_OpaqueLayer.BringToFront();}this.m_OpaqueLayer.Enabled = true;this.m_OpaqueLayer.Visible = true;}catch { }}/// <summary>/// 隐藏遮罩层/// </summary>public void HideOpaqueLayer(){try{if (this.m_OpaqueLayer != null){this.m_OpaqueLayer.Visible = false;this.m_OpaqueLayer.Enabled = false;}}catch(Exception ex){//MessageBox.Show(ex.Message); }}}}

源码下载:自定义半透明遮罩层-源码.rar

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。