我正在构建一个自定义控件,它有自己的一组标头。
标头(另一个自定义控件)作为上述自定义控件的子控件存在。
当我调整标头(子控件的一部分)的大小时,子控件调用了对自身的失效(),它应该将消息排队重新绘制。
子控件无效后,父控件被通知消息头已经调整了大小,并且它发出了自己的失效()命令。
下面的跟踪显示了这一点:
Headers.Invalidate()
List.Invalidate()
Headers.Invalidate()
List.Invalidate()
但是,当需要重新绘制时,父控件首先接收它的画图事件,然后是标头控件:
List.Paint
Headers.Paint
当我快速移动鼠标时,鼠标移动事件似乎在画图事件前面排队,因此继续调用无效日期,但是父控件的画图事件总是首先触发:
List.Paint
List.Paint
List.Paint
List.Paint
Headers.Paint
List.Paint
List.Paint
Headers.Paint
这导致标头控件在很大程度上落后于列表。理想情况下,这两个画图事件将一起触发,所有鼠标移动事件都会在画图事件之前排队(这样画图总是同步的,但是鼠标事件都会在画图之间被刷新)。
我不知道从哪里着手解决这个问题。
我应该从哪里开始,来修正我的标题所经历的滞后?
发布于 2011-12-14 23:48:55
解决方法是使用Update或Refresh方法,通过手动绘制使重绘同步。
Update方法将简单地同步地重新绘制控件和所有子元素。
Refresh方法将使控件和所有子控件失效,然后调用Update。
发布于 2011-12-14 08:30:07
你已经在使用双缓冲了吗?它可能会慢一些,但是它应该同步重绘,这样当更新发生时,两者都会出现更新。
您可以在以下情况下以形式打开双缓冲:
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);此外,您还可以尝试:
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, false);https://stackoverflow.com/questions/8500483
复制相似问题