在网页中通过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

C# Winform 实现自定义半透明loading加载遮罩层的更多相关文章

  1. ajax异步加载遮罩层特效

    <!doctype html> <html> <head> <title>遮罩层(正在加载中)</title> <meta chars ...

  2. echarts 设置数据加载遮罩层

    //显示加载数据的loading        chart.showLoading({            text: "图表数据正在努力加载...",            x ...

  3. vue2 自定义全局组件(Loading加载效果)

    vue2 自定义全局组件(Loading加载效果) github地址: https://github.com/ccyinghua/custom-global-component 一.构建项目 vue ...

  4. HTML5 五彩圆环Loading加载动画实现教程

    原文:HTML5 五彩圆环Loading加载动画实现教程 今天我们要来介绍一款效果很特别的HTML5 Loading加载动画,不像其他的Loading动画,这款Loading动画颜色很丰富,并且在转圈 ...

  5. 使用Dialog实现全局Loading加载框

    Dialog实现全局Loading加载框 很多人在实现Loading加载框的时候,都是在当前的页面隐藏一个Loading布局,需要加载的时候,显示出来,加载完再隐藏 使用Dialog实现Loading ...

  6. vue+elementUI+axios实现的全局loading加载动画

    在项目中,很多时候都需要loading加载动画来缓解用户的焦虑等待,比如说,我打开了一个页面,而这个页面有很多接口请求,但浏览器的请求并发数就那么几个,再加上如果网速不行的话,那么这时候,用户很可能就 ...

  7. WPF 客户端浏览器 添加Loading加载进度

    在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的. 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等. 因此 ...

  8. QT自定义控件系列(二) --- Loading加载动画控件

    本系列主要使用Qt painter来实现一些基础控件.主要是对平时自行编写的一些自定义控件的总结. 为了简洁.低耦合,我们尽量不使用图片,qrc,ui等文件,而只使用c++的.h和.cpp文件. 由于 ...

  9. JVM自定义类加载器加载指定classPath下的所有class及jar

    一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...

随机推荐

  1. Visual C++ 打印编程技术-内存设备环境

    1.内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示 ...

  2. iOS app提交审核 11.13条款问题

    今年开年到现在.提交app应用一直招拒,这个问题我想不明白,感觉就是一个坑.所以贴出来给大家看看. 发件人 Apple11.13 - Apps that link to external mechan ...

  3. Codevs 1217 借教室 2012年NOIP全国联赛提高组

    1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...

  4. PAT_1026 程序运行时间

    问题描述: 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock ti ...

  5. Mysql备份数据库的一种方法

    今天添加了一个数据库自动备份的模块,mysql数据备份的方法有很多,可以对单个数据库备份,可以多个数据库备份,也可以对某一个表进行备份,可以只备份数据库的结构不备份数据,可以根据需要做不同处理,正好现 ...

  6. Python内存管理及引用计数

    作为一门动态语言,python很重要的一个概念就是动态类型,即对象的类型和内存占用都是运行时确定的.(Why?)运行时,解释器会根据语法和右操作数来决定新对象的类型.动态类型的实现,是通过引用和对象的 ...

  7. 自己写的访问SqlServer数据库的通用DAL层

    如题,直接贴代码. 首先是DataTable转List<T>的方法,这个方法通用性极强. #region Table转List /// <summary> /// Table转 ...

  8. 入门2:PHP相关的名词解释

    /**宝宝我英语不好,后面注释拼音 请见谅**/ 1.Linux 开源的操作系统,在服务器端用户数量非常大,很多服务器都是使用Linux系统运行的. 相对windows系统来说具有非常完善的用户权限系 ...

  9. Python冒泡排序

    冒泡排序,顾名思义,按照一定的规则,把数据一直排下去 直接上代码 import random def bubblesort(data): for i in range(len(data)-1,1,-1 ...

  10. Python httpsqs封装类

    ''' httpsqs队列封装 @author xp_go@qq.com a = HttpsqsClient('192.168.0.218','1218','httpsqsmmall.com') pr ...