zoukankan      html  css  js  c++  java
  • C#实现Winform自定义半透明遮罩层

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

    效果图如下,正常时:

    显示遮罩层时:

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

    View Code
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.ComponentModel;
    
    namespace MyOpaqueLayer
    {
        /// <summary>
        /// 自定义控件:半透明控件
        /// </summary>
        /* 
         * [ToolboxBitmap(typeof(MyOpaqueLayer))]
         * 用于指定当把你做好的自定义控件添加到工具栏时,工具栏显示的图标。
         * 正确写法应该是
         * [ToolboxBitmap(typeof(XXXXControl),"xxx.bmp")]
         * 其中XXXXControl是你的自定义控件,"xxx.bmp"是你要用的图标名称。
        */
        [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(125, true)
            {
            }
    
            public MyOpaqueLayer(int Alpha, bool IsShowLoadingImage)
            {
                SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
                base.CreateControl();
    
                this._alpha = Alpha;
                if (IsShowLoadingImage)
                {
                    PictureBox pictureBox_Loading = new PictureBox();
                    pictureBox_Loading.BackColor = System.Drawing.Color.White;
                    pictureBox_Loading.Image = 加载中.Properties.Resources.loading;  
                    pictureBox_Loading.Name = "pictureBox_Loading";
                    pictureBox_Loading.Size = new System.Drawing.Size(48, 48);
                    pictureBox_Loading.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
                    Point Location = new Point(this.Location.X + (this.Width - pictureBox_Loading.Width) / 2, this.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, 0, 0, vlblControlWidth, vlblControlHeight);
                e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, vlblControlWidth, vlblControlHeight);
            }
    
    
            protected override CreateParams CreateParams//v1.10 
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x00000020; //0x20;  // 开启 WS_EX_TRANSPARENT,使控件支持透明
                    return cp;
                }
            }
    
            /*
             * [Category("myOpaqueLayer"), Description("是否使用透明,默认为True")]
             * 一般用于说明你自定义控件的属性(Property)。
             * Category用于说明该属性属于哪个分类,Description自然就是该属性的含义解释。
             */
            [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();
                }
            }
        }
    }

    OpaqueCommand的方法:ShowOpaqueLayer(显示遮罩层)和HideOpaqueLayer(隐藏遮罩层)

    View Code
    using System;
    using System.Windows.Forms;
    
    namespace 加载中
    {
        class OpaqueCommand
        {
            private MyOpaqueLayer.MyOpaqueLayer m_OpaqueLayer = null;//半透明蒙板层
    
            /// <summary>
            /// 显示遮罩层
            /// </summary>
            /// <param name="control">控件</param>
            /// <param name="alpha">透明度</param>
            /// <param name="isShowLoadingImage">是否显示图标</param>
            public void ShowOpaqueLayer(Control control, int alpha, bool isShowLoadingImage)
            {
                try
                {
                    if (this.m_OpaqueLayer == null)
                    {
                        this.m_OpaqueLayer = new MyOpaqueLayer.MyOpaqueLayer(alpha, isShowLoadingImage);
                        control.Controls.Add(this.m_OpaqueLayer);
                        this.m_OpaqueLayer.Dock = DockStyle.Fill;
                        this.m_OpaqueLayer.BringToFront();
                    }
                    this.m_OpaqueLayer.Enabled = true;
                    this.m_OpaqueLayer.Visible = true;
                }
                catch { }
            }
    
            /// <summary>
            /// 隐藏遮罩层
            /// </summary>
            public void HideOpaqueLayer()
            {
                try
                {
                    if (this.m_OpaqueLayer != null)
                    {
                        this.m_OpaqueLayer.Visible = false;
                        this.m_OpaqueLayer.Enabled = false;
                    }
                }
                catch(Exception ex)
                {
                    //MessageBox.Show(ex.Message);
                }
            }
        }
    }

    源码下载:自定义半透明遮罩层-源码.rar

  • 相关阅读:
    计算页数
    DOS批量拷贝文件
    时间与日期处理
    MOUSE_OVER/MOUSE_OUT与ROLL_OVER/ROLL_OUT的区别
    vb程序改写方法。
    sqldmo备份还原sqlserver2000数据库
    终于有了自己的窝啦
    vb中创建Excel,把数据存入Excel
    提高vb 》excel数据的导入速度
    SQLServer2000数据库特有的1433端口号不能访问
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/2579215.html
Copyright © 2011-2022 走看看