透明度绘制复合层而不是重绘

时间:2010-09-11 04:18:57

标签: c# winforms drawing gdi+

我有一个自定义控件,我在其中覆盖以下方法来创建透明背景:

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }

在paint方法上,我这样做:

    protected override void OnPaint(PaintEventArgs p)
    {
        base.OnPaint(p);
        Graphics e = p.Graphics;
        this.Size = Resources.CenterButtonHover.Size;
        if (mousedown)
        {
            e.DrawImage(Resources.CenterButtonDown, new Point(0, 0));
        }
        else if (hover)
        {
            e.DrawImage(Resources.CenterButtonHover, new Point(0, 0));
        }
        else
        {
            e.DrawImage(Resources.CenterButtonNormal, new Point(4, 4));
        }
        e.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    }

关于调用this.Invalidate的各种鼠标事件。

正确渲染透明度,但每次渲染透明度都会渲染到最后渲染的顶部,而不是重绘。这会使光晕变得越来越强烈,直到它只是一个大斑点。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我通过保持一个bool来解决它是否在重新绘制之前是否有需要删除的渐变。

        if (needsreset)
        {
            this.SuspendLayout();
            this.Region = new Region(this.ClientRectangle);
            needsreset = false;
            return;
        }