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

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

效果图如下,正常时:

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

显示遮罩层时:

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

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

 

1using System;
2using System.Drawing;
3using System.Windows.Forms;
4using System.ComponentModel;
5 
6namespace MyOpaqueLayer
7{
8    /// <summary>
9    /// 自定义控件:半透明控件
10    /// </summary>
11    /*
12     * [ToolboxBitmap(typeof(MyOpaqueLayer))]
13     * 用于指定当把你做好的自定义控件添加到工具栏时,工具栏显示的图标。
14     * 正确写法应该是
15     * [ToolboxBitmap(typeof(XXXXControl),"xxx.bmp")]
16     * 其中XXXXControl是你的自定义控件,"xxx.bmp"是你要用的图标名称。
17    */
18    [ToolboxBitmap(typeof(MyOpaqueLayer))]
19    public class MyOpaqueLayer : System.Windows.Forms.Control
20    {
21        private bool _transparentBG = true;//是否使用透明
22        private int _alpha = 125;//设置透明度
23       
24        private System.ComponentModel.Container components = new System.ComponentModel.Container();
25 
26        public MyOpaqueLayer()
27            : this(125, true)
28        {
29        }
30 
31        public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage)
32        {
33            SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
34            base.CreateControl();
35 
36            this._alpha = Alpha;
37            if (IsShowLoadingImage)
38            {
39                PictureBox pictureBox_Loading = new PictureBox();
40                pictureBox_Loading.BackColor = System.Drawing.Color.White;
41                pictureBox_Loading.Image = 加载中.Properties.Resources.loading; 
42                pictureBox_Loading.Name = "pictureBox_Loading";
43                pictureBox_Loading.Size = new System.Drawing.Size(48, 48);
44                pictureBox_Loading.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
45                Point Location = new Point(this.Location.X + (this.Width - pictureBox_Loading.Width) / 2, this.Location.Y + (this.Height - pictureBox_Loading.Height) / 2);//居中
46                pictureBox_Loading.Location = Location;
47                pictureBox_Loading.Anchor = AnchorStyles.None;
48                this.Controls.Add(pictureBox_Loading);
49            }
50        }
51 
52 
53        protected override void Dispose(bool disposing)
54        {
55            if (disposing)
56            {
57                if (!((components == null)))
58                {
59                    components.Dispose();
60                }
61            }
62            base.Dispose(disposing);
63        }
64 
65        /// <summary>
66        /// 自定义绘制窗体
67        /// </summary>
68        /// <param name="e"></param>
69        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
70        {
71            float vlblControlWidth;
72            float vlblControlHeight;
73 
74            Pen labelBorderPen;
75            SolidBrush labelBackColorBrush;
76 
77            if (_transparentBG)
78            {
79                Color drawColor = Color.FromArgb(this._alpha, this.BackColor);
80                labelBorderPen = new Pen(drawColor, 0);
81                labelBackColorBrush = new SolidBrush(drawColor);
82            }
83            else
84            {
85                labelBorderPen = new Pen(this.BackColor, 0);
86                labelBackColorBrush = new SolidBrush(this.BackColor);
87            }
88            base.OnPaint(e);
89            vlblControlWidth = this.Size.Width;
90            vlblControlHeight = this.Size.Height;
91            e.Graphics.DrawRectangle(labelBorderPen, 0, 0, vlblControlWidth, vlblControlHeight);
92            e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, vlblControlWidth, vlblControlHeight);
93        }
94 
95 
96        protected override CreateParams CreateParams//v1.10
97        {
98            get
99            {
100                CreateParams cp = base.CreateParams;
101                cp.ExStyle |= 0x00000020; //0x20;  // 开启 WS_EX_TRANSPARENT,使控件支持透明
102                return cp;
103            }
104        }
105 
106        /*
107         * [Category("myOpaqueLayer"), Description("是否使用透明,默认为True")]
108         * 一般用于说明你自定义控件的属性(Property)。
109         * Category用于说明该属性属于哪个分类,Description自然就是该属性的含义解释。
110         */
111        [Category("MyOpaqueLayer"), Description("是否使用透明,默认为True")]
112        public bool TransparentBG
113        {
114            get
115            {
116                return _transparentBG;
117            }
118            set
119            {
120                _transparentBG = value;
121                this.Invalidate();
122            }
123        }
124 
125        [Category("MyOpaqueLayer"), Description("设置透明度")]
126        public int Alpha
127        {
128            get
129            {
130                return _alpha;
131            }
132            set
133            {
134                _alpha = value;
135                this.Invalidate();
136            }
137        }
138    }
139}

 

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

 

1using System;
2using System.Windows.Forms;
3 
4namespace 加载中
5{
6    class OpaqueCommand
7    {
8        private MyOpaqueLayer.MyOpaqueLayer m_OpaqueLayer = null;//半透明蒙板层
9 
10        /// <summary>
11        /// 显示遮罩层
12        /// </summary>
13        /// <param name="control">控件</param>
14        /// <param name="alpha">透明度</param>
15        /// <param name="isShowLoadingImage">是否显示图标</param>
16        public void ShowOpaqueLayer(Control control, int alpha, bool isShowLoadingImage)
17        {
18            try
19            {
20                if (this.m_OpaqueLayer == null)
21                {
22                    this.m_OpaqueLayer = new MyOpaqueLayer.MyOpaqueLayer(alpha, isShowLoadingImage);
23                    control.Controls.Add(this.m_OpaqueLayer);
24                    this.m_OpaqueLayer.Dock = DockStyle.Fill;
25                    this.m_OpaqueLayer.BringToFront();
26                }
27                this.m_OpaqueLayer.Enabled = true;
28                this.m_OpaqueLayer.Visible = true;
29            }
30            catch { }
31        }
32 
33        /// <summary>
34        /// 隐藏遮罩层
35        /// </summary>
36        public void HideOpaqueLayer()
37        {
38            try
39            {
40                if (this.m_OpaqueLayer != null)
41                {
42                    this.m_OpaqueLayer.Visible = false;
43                    this.m_OpaqueLayer.Enabled = false;
44                }
45            }
46            catch(Exception ex)
47            {
48                //MessageBox.Show(ex.Message);
49            }
50        }
51    }
52}

 

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

files.cnblogs.com/JuneZhang/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8D%8A%E9%80%8F%E6%98%8E%E9%81%AE%E7%BD%A9%E5%B1%82-%E6%BA%90%E7%A0%81.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值