• C# Winform 实现自定义半透明loading加载遮罩层


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

    效果图如下,正常时:

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

    显示遮罩层时:

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

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

    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

  • 相关阅读:
    深度学习原理与框架-神经网络-线性回归与神经网络的效果对比 1.np.c_[将数据进行合并] 2.np.linspace(将数据拆成n等分) 3.np.meshgrid(将一维数据表示为二维的维度) 4.plt.contourf(画出等高线图,画算法边界)
    深度学习原理与框架-神经网络-cifar10分类(代码) 1.np.concatenate(进行数据串接) 2.np.hstack(将数据横着排列) 3.hasattr(判断.py文件的函数是否存在) 4.reshape(维度重构) 5.tanspose(维度位置变化) 6.pickle.load(f文件读入) 7.np.argmax(获得最大值索引) 8.np.maximum(阈值比较)
    深度学习原理与框架-神经网络架构 1.神经网络构架 2.激活函数(sigmoid和relu) 3.图片预处理(减去均值和除标准差) 4.dropout(防止过拟合操作)
    Linux执行命令unable to create new native thread问题
    ElasticSearch的备份迁移方案
    Mycat高可用集群搭建
    Mogodb集群搭建
    SparkStreaming和Drools结合的HelloWord版
    Drools的HelloWord例子
    Drools环境搭建
  • 原文地址:https://www.cnblogs.com/rr163/p/4012656.html
Copyright © 2020-2023  润新知