在Winform中实现半透明遮罩层

效果图如下,正常时:

遮罩时:

控件代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace MyOpaqueLayer
{

    [ToolboxBitmap(
typeof(MyOpaqueLayer))]
    
public class MyOpaqueLayer : System.Windows.Forms.Control
    {
        
private bool _transparentBG = true;
        
private int _alpha = 125;


        
private System.ComponentModel.Container components = new System.ComponentModel.Container();


        
public MyOpaqueLayer()
            : 
this(125true)
        {

        }


        
public MyOpaqueLayer(int Alpha, bool showLoadingImage)
        {
            SetStyle(System.Windows.Forms.ControlStyles.Opaque, 
true);
            
base.CreateControl();
            
this._alpha = Alpha;
            ;
            
if (showLoadingImage)
            {
                PictureBox pictureBox_Loading 
= new PictureBox();
                pictureBox_Loading.BackColor 
= System.Drawing.Color.White;
                pictureBox_Loading.Image 
= global::MyOpaqueLayer.Properties.Resources.loading;
                pictureBox_Loading.Name 
= "pictureBox_Loading";
                pictureBox_Loading.Size 
= new System.Drawing.Size(4848);
                pictureBox_Loading.SizeMode 
= System.Windows.Forms.PictureBoxSizeMode.AutoSize;
                Point Location 
= new Point(this.Location.X + (this.Width - pictureBox_Loading.Width) / 2this.Location.Y + (this.Height - pictureBox_Loading.Height) / 2);
                pictureBox_Loading.Location 
= Location;
                pictureBox_Loading.Anchor 
= AnchorStyles.None;
                
this.Controls.Add(pictureBox_Loading);
            }
        }


        
protected override void Dispose(bool disposing)
        {
            
if (disposing)
            {
                
if (!((components == null)))
                {
                    components.Dispose();
                }
            }
            
base.Dispose(disposing);
        }

        
/// <summary>
        
/// 自定义绘制窗体
        
/// </summary>
        
/// <param name="e"></param>
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            
float vlblControlWidth;
            
float vlblControlHeight;

            Pen labelBorderPen;
            SolidBrush labelBackColorBrush;

            
if (_transparentBG)
            {
                Color drawColor 
= Color.FromArgb(this._alpha, this.BackColor);
                labelBorderPen 
= new Pen(drawColor, 0);
                labelBackColorBrush 
= new SolidBrush(drawColor);
            }
            
else
            {
                labelBorderPen 
= new Pen(this.BackColor, 0);
                labelBackColorBrush 
= new SolidBrush(this.BackColor);
            }
            
base.OnPaint(e);
            vlblControlWidth 
= this.Size.Width;
            vlblControlHeight 
= this.Size.Height;
            e.Graphics.DrawRectangle(labelBorderPen, 
00, vlblControlWidth, vlblControlHeight);
            e.Graphics.FillRectangle(labelBackColorBrush, 
00, vlblControlWidth, vlblControlHeight);

        }
        
/// <summary>
        
/// 
        
/// </summary>
        protected override CreateParams CreateParams//v1.10 
        {
            
get
            {
                CreateParams cp 
= base.CreateParams;
                cp.ExStyle 
|= 0x20;  // 开启 WS_EX_TRANSPARENT,使控件支持透明
                return cp;
            }
        }

        [Category(
"myOpaqueLayer"), Description("是否使用透明,默认为True")]
        
public bool TransparentBG
        {
            
get { return _transparentBG; }
            
set
            {
                _transparentBG 
= value;
                
this.Invalidate();
            }
        }

        [Category(
"myOpaqueLayer"), Description("设置透明度")]
        
public int Alpha
        {
            
get { return _alpha; }
            
set
            {
                _alpha 
= value;
                
this.Invalidate();
            }
        }

    }


}

源码下载:

遮罩层源码

原文地址:https://www.cnblogs.com/zhaobl/p/1642145.html