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