欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Winform下透明Panel

程序员文章站 2022-10-06 16:07:44
网上很多写着透明Panel的方法,都是把BackColor属性设置为透明,然后指定Parent,实验了一下,对于部分情况下,是可用的,例如下层本身有自带的控件,但是,如果是用Graphic绘制的内容,上层放一个设置了BackColor为透明的Panel则不起作用。 Google了一下,在Stack ......

网上很多写着透明panel的方法,都是把backcolor属性设置为透明,然后指定parent,实验了一下,对于部分情况下,是可用的,例如下层本身有自带的控件,但是,如果是用graphic绘制的内容,上层放一个设置了backcolor为透明的panel则不起作用。

google了一下,在stack overflow上找到了一个自定义透明panel

public class extendedpanel : panel
    {
        private const int ws_ex_transparent = 0x20;
        public extendedpanel()
        {
            setstyle(controlstyles.opaque, true);
        }

        private int opacity = 50;
        [defaultvalue(50)]
        public int opacity
        {
            get
            {
                return this.opacity;
            }
            set
            {
                if (value < 0 || value > 100)
                    throw new argumentexception("value must be between 0 and 100");
                this.opacity = value;
            }
        }
        protected override createparams createparams
        {
            get
            {
                createparams cp = base.createparams;
                cp.exstyle = cp.exstyle | ws_ex_transparent;
                return cp;
            }
        }
        protected override void onpaint(painteventargs e)
        {
            using (var brush = new solidbrush(color.fromargb(this.opacity * 255 / 100, this.backcolor)))
            {
                e.graphics.fillrectangle(brush, this.clientrectangle);
            }
            base.onpaint(e);
        }
    }

这个自定义panel可以解决问题,下图就是效果,透明的灰色是extendedpanel,黑色画线部分则是graphic绘制的。

Winform下透明Panel