我正在构建一个具有自己的标头集的自定义控件。
标题(另一个自定义控件)作为上述自定义控件的子控件存在。
当我调整标题(子控件的一部分)的大小时,子控件本身正在调用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 :(得分:1)
答案是通过使用Update
或Refresh
方法手动绘图来重绘同步。
Update
方法只会同步重新绘制控件和所有子项。
Refresh
方法会使控件和所有孩子无效,然后会调用Update
。
答案 1 :(得分:0)
您可以使用以下内容在表单中启用双缓冲:
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
另外,您可能想尝试:
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, false);