我想在C#中创建一个自定义控件。但是每次我必须完全重新绘制控件时,即使使用双缓冲(首先绘制图像,然后进行blitting),它也会闪烁。如何消除Windows.Forms滚动时自定义控件的闪烁?
当我必须完全重新绘制时,如何消除闪烁?
我想在C#中创建一个自定义控件。但是每次我必须完全重新绘制控件时,即使使用双缓冲(首先绘制图像,然后进行blitting),它也会闪烁。如何消除Windows.Forms滚动时自定义控件的闪烁?
当我必须完全重新绘制时,如何消除闪烁?
您可以尝试在InitiliseComponent调用之后在构造函数中放入以下内容。
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
编辑:
如果你给这个一去,如果你可以删除自己的双缓冲的代码,只是有控制绘制自身以响应适当的虚拟方法被调用。
你说你已经尝试了双缓冲,但是接下来你会说先绘制图像然后blitting。你有没有尝试在构造函数中设置DoubleBuffered = true,而不是自己用Image创建它?
可能不够好,只是叫
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
你看到的很可能是因为Windows绘制控件的背景第一(通过WM_ERASEBKGND)闪烁,然后要求你的控制做任何绘图你需要做(通过WM_PAINT)。通过禁用背景涂料并在OnPaint覆盖中进行所有绘制,可以消除99%的情况下的问题,而无需使用双缓冲所需的全部内存。
我从一个正常工作的C#程序中获得了这个结果。其他海报语法错误和由C显然复制++而不是C#
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
我通常把这些东西在Application.Run之前,但这个啊,我认为是解决这个问题的最佳解决方案。 – Quibblesome 2008-09-15 16:38:45