Двойная буферизация, дающая черное окно - PullRequest
0 голосов
/ 02 мая 2018

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

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

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

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

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

screenshot

1 Ответ

0 голосов
/ 02 мая 2018

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

    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 );
    }   
...