none
GDI+双缓冲 RRS feed

  • 问题

  • 自定义了一个Panel控件,主要是为了实现一个半透明的Panel可以将其下面遮罩的部分给显示出来和具有自定义颜色的边框,而且在拖动这个Panel时不会出现闪动的情况。

    构造方法里面的代码如下:

        this.SetStyle(ControlStyles.Opaque, true);
                this.SetStyle(ControlStyles.UserPaint, true);
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                base.CreateControl();

    重写的OnPaint事件里的代码如下

    protected override void OnPaint(PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                Bitmap map = new Bitmap(this.Width, this.Height);
                Graphics bufG = Graphics.FromImage(map);
                g.Clear(this.BackColor);
                bufG.Clear(this.BackColor);
                bufG.DrawRectangle(new Pen(Color.FromArgb(125, this.BackColor), 0), 0, 0, this.Width, this.Height);
                bufG.FillRectangle(new SolidBrush(Color.FromArgb(125, this.BackColor)), 0, 0, this.Width, this.Height);
                g.DrawImage(map, 0, 0);
                bufG.Dispose();
                map.Dispose();
                base.OnPaint(e);
            }

    protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x20; // 开启 WS_EX_TRANSPARENT,使控件支持透明
                    return cp;
                }
            }

    双缓冲我也开启了,结果透明也没有实现,而且我在界面上拖动这个Panel时闪动的情况也特厉害。还请哪位高手给看看问题出在什么地方啊?

    2013年7月23日 1:35