Winform下透明Panel

網上不少寫着透明Panel的方法,都是把BackColor屬性設置爲透明,而後指定Parent,實驗了一下,對於部分狀況下,是可用的,例以下層自己有自帶的控件,可是,若是是用Graphic繪製的內容,上層放一個設置了BackColor爲透明的Panel則不起做用。ide

Google了一下,在Stack Overflow上找到了一個自定義透明Panelvisual-studio

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繪製的。this

相關文章
相關標籤/搜索