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

摘要:
*正确的写法应该是*[ToolboxBitmap]*,其中XXXXControl是您的自定义控件,“xxx.bmp”是您要使用的图标名称*/[Toolbox位图]publicclassMyOpaqueLayer:System.Windows.Forms.control{privatepool_transparentBG=true;//是否使用透明度privateint_alpha=125;//设置透明度privateSystem.ComponentModel.Containercomponents=newSystem.ComponentModelContainer();publicMyOpaqueLayer():this{}publicMyOpiqueLayer{SetStyle;base.CreateControl();this.alpha=alpha;if{PictureBoxPictureBox_Loading=newPictureBox() ; pictureBox_ Loading.BackColor=System.Drawing.Color.White;pictureBox_加载。Image=正在加载。属性。资源。加载;pictureBox_加载。Name=“pictureBox_Loading”;pictureBox_ Loading.Size=newSystem.Drawing.Size;pictureBox_ Loading.SizeMode=System.Windows.Forms.PictureBoxSizeMode.AutoSize;点位置=newPoint;//居中的pictureBox_ Loading.Location=位置;pictureBox_ Loading.Anchor=AnchorStyles.None;this.Controls.Add;}}protectedoverridevoidDispose{if{if(!){components.Dispose();}}base。Dispose;}//////自定义绘图表单////////protectedoverridevoidOnPaint{floatblControlWidth;floatblControl Height;PenlabelBorderPen;SolidBrushlabelBackColorBrush;如果{ColorrawColor=Color.FromArgb;labelBorderPen=newPen;labelBackColorBrush=newSolidBrush;}否则{labelBorderPen=newPen;labelBackColorBrush=newSolidBruce;}base.OnPint;vlblControlWidth=this.Size.Width;vlblControlHeight=this.Size.Height;e、 Graphics.DrawRectangle;e、 Graphics.FillRectangle;}ProtectedoverrideCreateParamsCreateParams//v1.10{get{CreateParamscp=base.CreateParams;cp.ExStyle |=0x00000020;//0x20;//启用WS_EX_TRANSPARENT以使控件支持透明返回cp;}}/**[Category,Description]*通常用于描述自定义控件的属性*类别用于描述属性所属的类别。描述自然是对属性的解释。

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

效果图如下,正常时:

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

显示遮罩层时:

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

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

C#实现Winform自定义半透明遮罩层第3张C#实现Winform自定义半透明遮罩层第4张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(隐藏遮罩层)

C#实现Winform自定义半透明遮罩层第5张C#实现Winform自定义半透明遮罩层第6张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

免责声明:文章转载自《C#实现Winform自定义半透明遮罩层》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇人脸识别Demo解析C#JAVA-多版本JDK的安装配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

新认知之WinForm窗体程序

Windows应用程序和控制台应用程序有很大的区别 》Form1.cs :窗体文件,程序员对窗体编写的代码一般都存放在这个文件中。 》Form1.Designer.cs :窗体设计文件,其中的代码是有Visual Studio自动生成的,一般不需要修改。 》Form1.resx :资源文件,用来配置当前窗体所使用的字符串,图片等资源。 》Program.c...

【转载】Visual Studio2017如何打包发布Winform窗体程序

在用C#语言编写好Winform窗体程序后,最后一步的操作是将设计好的Winform程序代码进行打包以及发布成安装包。在Visual Studio2017开发工具中,打包发布WinForm程序是比较简单的,只需要简单的几部操作即可完成打包发布操作,此文简要介绍Visual Studio2017打包发布WinForm程序的流程。 (1)首先选中需要打包发布的...

解决C# WINFORM程序只允许运行一个实例的几种方法详解

要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现: 方法一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例. 把program.cs文件里的Main()函数改为如下代码: using System; using System.Windows.Forms; using System.Runtime.InteropServices;...

【DevExpress】4、在WinForm里用反射模拟Web里面的超链接功能

这几个月一直在用DevExpress做公司的一个工具,布局模仿DevExpress控件包里面的一个示例(如上图),用Dev的朋友们应该对这个很熟悉吧#^_^#,从里面学到了许多东西,控件的基本使用,以及一些好的设计理念,哈哈,也不知道算不算理念,反正对我自己挺有帮助的,这里就总结了下,对自己是个巩固,如果有不恰当的地方,请大家不要吝惜手中的砖头。 布局...

【转】C# WinForm中的Label如何换行

        第一种是把Label的AutoSize属性设为False,手动修改Label的大小.这样的好处是会因内容的长度而自动换行,但是当内容的长度超过所设定的大小时,多出的内容就会无法显示.因此,这种方法适合于基本确定内容长度的时候使用.         第二种是把Label的Dock设为FILL,同时将AutoSize属性设为False,这种方法...

winform知识

控件相关 1.文本框/label高度 文本框Multiline属性,设为true就可以了。改完高度后再将此属性改回来,要不然多行文本框,按回去就去下一行了。 label的改autoSize属性,设为false就可以了。 2.控件中文字居中 TextAlign属性:MiddleCenter 3.颜色属性 直接输入 #xxxx 4.如何去掉button按钮的...