2011-12-14 94 views
0

我正在构建具有自己的标头集的自定义控件。如何在父级控件的子控件重新绘制之前阻止父级控件的重绘?

标题(另一个自定义控件)作为上述自定义控件的子控件存在。

当我调整头部(子控件的一部分)的大小时,子控件本身正在调用Invalidate(),它应该将消息排队以重新绘制。

在子控件失效后,会通知父控件头标已调整大小,并发出自己的Invalidate()命令。

这是由该跟踪所示:

Headers.Invalidate()
List.Invalidate()
Headers.Invalidate()
List.Invalidate()

然而,当它开始重新绘制时,父控件首先收到它的Paint事件,然后是标题控件:

List.Paint
Headers.Paint

当我快速移动鼠标,鼠标移动事件出现在油漆事件的前面排队,所以无效信号继续被调用,但父控件的绘制事件总是首先开火:

List.Paint
List.Paint
List.Paint
List.Paint
Headers.Paint
List.Paint
List.Paint
Headers.Paint

这使得头控制列表落后于基本上。理想情况下,两个绘画事件都会一起触发,并且所有鼠标移动事件都会在绘画事件之前排队(这样绘画总是同步的,但是鼠标事件都会在绘画之间刷新)。

我没有想法从哪里开始解决这个问题。

从哪里开始,解决我头部遇到的滞后问题?

+0

Windows绘画顺序始终为Z顺序,无法更改。 Windows消息顺序始终是先输入,最后涂刷,不能更改。移动鼠标不应该导致绘画事件。缓慢涂料的标准原因是使用了太多的控制。 – 2011-12-15 00:53:05

+0

@HansPassant,谢谢,我一直在通过反复试验来了解这一点。但是,移动鼠标必须导致颜色,因为我正在调整列的大小。 – 2011-12-15 00:55:16

回答

0

你已经使用双缓冲? 它可能会比较慢,但它应该同步重新绘制,以便两者在发生更新时似乎都会更新。

您可以在表格上双缓冲切换使用:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

此外,您可能也想尝试:

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
    SetStyle(ControlStyles.Opaque, true); 
    SetStyle(ControlStyles.SupportsTransparentBackColor, false); 
1

答案是手工绘制,使重画同步,使用UpdateRefresh方法。

Update方法将简单地重新绘制控件和所有孩子同步。

Refresh方法将使控件和所有孩子无效,然后将调用Update