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

时间:2020-03-05 18:53:50  来源:igfitidea点击:

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

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

解决方案

回答

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

回答

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

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

编辑:

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

回答

打电话就足够了

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

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

回答

我从正在运行的Cprogram中提取了此代码。其他张贴者存在语法错误,并且清楚地从C ++复制而不是从C#复制

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