Прозрачность рисования составных слоев вместо перерисовки - PullRequest
3 голосов
/ 11 сентября 2010

У меня есть пользовательский элемент управления, в котором я переопределяю следующий метод для создания прозрачного фона:

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

В методе рисования я делаю это:

    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 Ответ

2 голосов
/ 11 сентября 2010

Я решил это, сохранив значение bool относительно того, был ли градиент, который нужно было удалить, или нет перед повторным рисованием.

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