如何在滚动时消除Windows.Forms自定义控件中的闪烁?

时间:2008-09-15 16:07:52

标签: c# .net winforms gdi+

我想在C#中创建自定义控件。但每当我必须完全重绘我的控件时,它就会闪烁,即使我使用双缓冲(首先绘制到图像,然后使用blitting)。

当我必须完全重绘时,如何消除闪烁?

4 个答案:

答案 0 :(得分:13)

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

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

编辑:

如果你这样做,如果可以的话,删除你自己的双缓冲代码,让控件自己绘制以响应被调用的相应虚拟方法。

答案 1 :(得分:8)

我从一个正在运行的C#程序中提取了这个。其他海报有语法错误,并清楚地从C ++而不是C#

复制
SetStyle(ControlStyles.OptimizedDoubleBuffer | 
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint, true);

答案 2 :(得分:1)

打电话

可能已经足够了
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);

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

答案 3 :(得分:0)

你说你已经尝试过双缓冲,但是你会说先画一张图像然后再拍它。您是否尝试在构造函数中设置DoubleBuffered = true而不是自己使用Image?