Двойная буферизация дает черное окно

У меня есть приложение, которое показывает данные (фондовый рынок) в пользовательском элементе управления, сделанном мной. В моем приложении может быть несколько пользовательских элементов управления на одном экране для анализа нескольких акций. Учитывая эту функциональность, пользователь может перемещаться от одного элемента управления к нескольким элементам управления на экране. Эта функциональность вызывала мерцание. Чтобы решить проблему мерцания, я использовал двойную буферизацию, которая была включена с помощью приведенного ниже кода:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}

Этот приведенный выше код определенно помог устранить проблему мерцания. Но возникла еще одна проблема: иногда в этом пользовательском элементе управления появляется черное окно. Все, что я нашел идеальным в потоке кода, но не смог выяснить причину этого черного окна.

Удаление двойной буферизации дает правильный результат, но снова появляется мерцание.

Вот изображение для лучшего понимания проблемы -

скриншот


person Arpit Gupta    schedule 02.05.2018    source источник
comment
Это альтернативный способ включения БД ( и выкл.)   -  person TaW    schedule 02.05.2018
comment
Вы пробовали Control.SetStyle() добавить ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true   -  person Jimi    schedule 02.05.2018


Ответы (1)


Я считаю, что написание моего собственного простого буфера может облегчить проблемы, связанные с собственным элементом управления:

    private void CreateBuffer()
    {       
        if (_buffer == null || _buffer.Size != ClientSize)
        {
            this._buffer?.Dispose();

            _buffer = new Bitmap( ClientSize.Width, ClientSize.Height );
        }
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        CreateBuffer();

        if (_is_dirty)
        {
            using (Graphics g = Graphics.FromImage( _buffer ))
            {       
                RenderEventArgs ev = new RenderEventArgs( _buffer, g );

                OnRender( ev ); /* Do your drawing here */
                _is_dirty = False;
            }
        }

        e.Graphics.DrawImage( _buffer, 0, 0 );
    }   
person lemon grass    schedule 02.05.2018