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

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

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

    效果图如下,正常时:

    显示遮罩层时:

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

    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(隐藏遮罩层)

    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

  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/grj001/p/12224491.html
Copyright © 2011-2022 走看看