关于c#:如何消除滚动时Windows.Forms自定义控件中的闪烁?

关于c#:如何消除滚动时Windows.Forms自定义控件中的闪烁?

How to eliminate flicker in Windows.Forms custom control when scrolling?

我想在C#中创建一个自定义控件。 但是,每次我必须完全重绘控件时,即使使用双重缓冲(首先绘制到Image并使其模糊化),它也会闪烁。

我必须完全重画时如何消除闪烁?


您可以尝试在InitiliseComponent调用之后将以下内容放入构造函数中。

1
2
3
SetStyle(ControlStyles.OptimizedDoubleBuffer |
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

编辑:

如果可以的话,请删除自己的双缓冲代码,并使控件自己绘制以响应调用适当的虚拟方法。


我从一个有效的C#程序中提取了此代码。其他张贴者存在语法错误,并且清楚地从C ++而不是C#复制

1
2
3
SetStyle(ControlStyles.OptimizedDoubleBuffer |
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint, true);

只需打电话就可以了

1
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);

您最可能看到的闪烁是因为Windows首先(通过WM_ERASEBKGND)绘制控件的背景,然后要求您控件进行任何需要做的绘制(通过WM_PAINT)。通过禁用背景绘画并在OnPaint覆盖中进行所有绘画,可以在99%的情况下消除此问题,而无需使用双缓冲所需的所有内存。


您说您曾经尝试过双重缓冲,但随后您说要先绘制到Image并将其涂抹。您是否尝试过在构造函数中设置DoubleBuffered = true而不是自己使用Image进行设置?


推荐阅读