双缓冲给黑色的窗口

时间:2018-05-02 12:30:00

标签: c# winforms double-buffering paintevent

我有一个应用程序,它显示我所做的用户控件中的数据(股票市场)。在我的应用程序中,单个屏幕上可能有多个用户控件来分析多个股票。 鉴于该功能,用户可以在屏幕上从1个控件移动到多个控件。 此功能给出了闪烁的问题。为了解决闪烁问题,我使用了双缓冲,这是通过以下代码启用的 -

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

以上代码肯定有助于消除闪烁问题。但创造了另一个问题 - 有时它会在该用户控件中显示黑色窗口。我在代码流程中找到的所有东西都很完美但却找不到这个黑色窗口的原因。

删除双缓冲可以提供正确的输出,但闪烁再次出现。

这是一张图片,供您更好地理解问题 -

screenshot

1 个答案:

答案 0 :(得分: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 );
    }