2008-09-15 65 views

回答

13

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

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

编辑:

如果你给这个一去,如果你可以删除自己的双缓冲的代码,只是有控制绘制自身以响应适当的虚拟方法被调用。

+0

我通常把这些东西在Application.Run之前,但这个啊,我认为是解决这个问题的最佳解决方案。 – Quibblesome 2008-09-15 16:38:45

0

你说你已经尝试了双缓冲,但是接下来你会说先绘制图像然后blitting。你有没有尝试在构造函数中设置DoubleBuffered = true,而不是自己用Image创建它?

1

可能不够好,只是叫

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

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

8

我从一个正常工作的C#程序中获得了这个结果。其他海报语法错误和由C显然复制++而不是C#

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