Прозрачный контроль мерцания при прокрутке - PullRequest
3 голосов
/ 11 мая 2011

Я создал приложение на C #, в котором есть пользовательские кнопки. Все они имеют прозрачный фон, поэтому я унаследовал от Control и переопределил CreateParams / OnPaintBackground и добавил функцию InvalidateEx.

Теперь мне нужна сетка, подобная макету (TableLayoutPanel), который также прозрачен. Я снова создал свой собственный элемент управления, переопределил CreateParams / OnPaintBackground и добавил функцию InvalidateEx. На свитке я вижу, что фоны "помнят", что он нарисовал, и поэтому я вижу призраки (если это правильное слово). Подключение функции InvalidateEx к событию Scroll заставит панель мерцать только при прокрутке.

Есть ли способ убрать это мерцание?

public class GridLayout : TableLayoutPanel
{
    public GridLayout()
    {
        this.Scroll += delegate { this.InvalidateEx(); };
    }

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

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // do nothing
    }

    protected void InvalidateEx()
    {
        if (Parent == null)
            return;

        Rectangle rc = new Rectangle(this.Location, this.Size);
        Parent.Invalidate(rc, true);
    }
}

Я думал об использовании WPF, но у меня нет опыта в этом, и мне нужно создать его за пару дней -> Winforms.

...