8

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

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

4

4 回答 4

13

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

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

编辑:

如果您尝试这样做,如果可以,请删除您自己的双缓冲代码,并让控件自行绘制以响应调用的适当虚拟方法。

于 2008-09-15T16:36:43.003 回答
8

我从一个工作的 C# 程序中提取了这个。其他海报有语法错误,显然是从 C++ 而不是 C# 复制的

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint, true);
于 2008-12-11T01:54:46.163 回答
1

打电话可能就足够了

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

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

于 2008-09-17T05:24:17.707 回答
0

你说你已经尝试过双缓冲,但是你说首先绘制到一个图像并对其进行 blitting。您是否尝试过在构造函数中设置 DoubleBuffered = true 而不是自己使用图像?

于 2008-09-15T16:16:43.253 回答