C# 双缓冲黑窗

C# 双缓冲黑窗,c#,winforms,double-buffering,paintevent,C#,Winforms,Double Buffering,Paintevent,我有一个应用程序,它显示了数据(股票市场)在一个用户控制我所做的。在我的应用程序中,在单个屏幕上可能有多个用户控件来分析多个股票。 有了这些功能,用户可以在屏幕上从一个控件移动到多个控件。 该功能出现了闪烁问题。为了解决闪烁问题,我使用了双缓冲,这是由下面的代码启用的- protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams;

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

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
}
上述代码肯定有助于消除闪烁问题。但另一个问题是—— 有时,它会在用户控件中显示一个黑色窗口。我在代码流中发现的一切都是完美的,但我无法找到这个黑色窗口的原因

移除双缓冲可以提供适当的输出,但闪烁再次出现在画面中

这是一张图片,让你们更好地理解这个问题-


我发现编写自己的简单缓冲区可以缓解依赖控件自身的问题:

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

是打开(和关闭)db的另一种方法。您是否尝试过添加
controlstyle.optimizeddublebuffer | controlstyle.allpaintingwmpaint | controlstyle.ResizeRedraw | controlstyle.UserPaint,true