C# Winform 实现自定义半透明loading加载遮罩层
在网页中通过div+css实现半透明效果不难,今天我们看看一种在winfrom中实现的方法:
效果图如下,正常时:
显示遮罩层时:
自定义遮罩层控件的源码如下:
1 | using System; |
2 | using System.Drawing; |
3 | using System.Windows.Forms; |
4 | using System.ComponentModel; |
5 | |
6 | namespace 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(隐藏遮罩层)
1 | using System; |
2 | using System.Windows.Forms; |
3 | |
4 | namespace 加载中 |
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