如何消除滚动时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);