半透明面板显示下面的控件

时间:2011-03-02 12:25:14

标签: c# winforms panel transparent paint

我有一个自定义控件,我用作橡皮筋,涂上蓝色边框和半透明中间。我正在处理鼠标按下/移动事件以调整面板的大小。当调用鼠标移动事件时,一切似乎都能正常工作,它都按照我的预期绘制,但是当鼠标停止移动时,半透明度下面的某些自定义控件会重新绘制在顶部。使用z顺序无所事事。

这是透明面板:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
                return cp;
            }
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            pe.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 101, 135, 196)), this.ClientRectangle);
            pe.Graphics.DrawRectangle(Pens.DarkBlue,
              pe.ClipRectangle.Left,
              pe.ClipRectangle.Top,
              this.Width - 1,
              this.Height - 1);
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            //do not allow the background to be painted 
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
        }

1 个答案:

答案 0 :(得分:0)

因此,事实证明这是一个非常难以解决的半透明问题(即使微软已经在资源管理器中完成了这个问题)。最后,我破解了一个解决方案,中间现在完全透明,橡皮筋只是一个边界。

边框仍然在某些控件下面绘制,因此对于每个控件,如果rubberBand可见,我们在其Paint事件中添加一个调用ruberBand.Invalidate()的语句。嘿presto,一个被束缚在一起的橡皮筋,它在控制之上。

IMO这比使用DrawReversibleRectangle更好,因为你可以在边缘的autoscrolling面板内使用它,而且它不会闪烁。