首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止父控件的重绘在其子控件的重绘之前跳到行中?

如何阻止父控件的重绘在其子控件的重绘之前跳到行中?
EN

Stack Overflow用户
提问于 2011-12-14 06:47:15
回答 2查看 1.1K关注 0票数 0

我正在构建一个自定义控件,它有自己的一组标头。

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

当我调整标头(子控件的一部分)的大小时,子控件调用了对自身的失效(),它应该将消息排队重新绘制。

子控件无效后,父控件被通知消息头已经调整了大小,并且它发出了自己的失效()命令。

下面的跟踪显示了这一点:

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

这导致标头控件在很大程度上落后于列表。理想情况下,这两个画图事件将一起触发,所有鼠标移动事件都会在画图事件之前排队(这样画图总是同步的,但是鼠标事件都会在画图之间被刷新)。

我不知道从哪里着手解决这个问题。

我应该从哪里开始,来修正我的标题所经历的滞后?

EN

回答 2

Stack Overflow用户

发布于 2011-12-14 23:48:55

解决方法是使用UpdateRefresh方法,通过手动绘制使重绘同步。

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-12-14 08:30:07

你已经在使用双缓冲了吗?它可能会慢一些,但是它应该同步重绘,这样当更新发生时,两者都会出现更新。

您可以在以下情况下以形式打开双缓冲:

代码语言:javascript
复制
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

此外,您还可以尝试:

代码语言:javascript
复制
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.Opaque, true);
    SetStyle(ControlStyles.SupportsTransparentBackColor, false);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8500483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档