zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    javascript封装与多态的体现
    js事件处理、事件对象
    对js中this的一点点理解
    js中的位运算
    css中的各种单位简述以及ios10下safari禁止缩放的问题
    js变量提升
    Web Worker javascript多线程编程(一)
    MongoDB数据库备份和恢复
    什么是Git及Git的诞生
    MongoDB安装过程
  • 原文地址:https://www.cnblogs.com/rr163/p/4012656.html
Copyright © 2011-2022 走看看