如何阻止父控件的重绘在其子控件的重绘之前跳出来?

时间:2011-12-14 06:47:15

标签: c# winforms winapi gdi+

我正在构建一个具有自己的标头集的自定义控件。

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

当我调整标题(子控件的一部分)的大小时,子控件本身正在调用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

这会导致标题控件大幅落后于列表。理想情况下,两个绘制事件将一起触发,并且所有鼠标移动事件将在绘制事件之前排队(因此绘制始终保持同步,但鼠标事件都在绘制之间刷新。)

我不知道从哪里开始解决这个问题。

我从哪里开始,修复标题遇到的延迟?

2 个答案:

答案 0 :(得分:1)

答案是通过使用UpdateRefresh方法手动绘图来重绘同步。

Update方法只会同步重新绘制控件和所有子项。

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

答案 1 :(得分:0)

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

您可以使用以下内容在表单中启用双缓冲:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

另外,您可能想尝试:

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