【问题标题】:How do I stop controls from twitching when I change their left positions and their widths?当我改变控件的左侧位置和宽度时,如何阻止控件抽动?
【发布时间】:2008-12-01 17:25:48
【问题描述】:

我有一个用户可以用鼠标调整大小的控件。当它们向右移动时,我只需更改宽度,一切正常。

但是,当他们移动左侧尺寸时,我必须更改 Left 和 Width 属性。控件的右侧明显抽搐,在新位置显示旧宽度。

如果我使用 Bounds 同时设置 left 和 width ,它仍然会抽搐;我是否将 SetStyle 与 UserPaint、Opaque、OptimizedDoubleBuffer、AllPaintingInWmPaint 或 ResizeRedraw 中的任何一个一起使用;以及它是否是双缓冲的。如果我在控件或其父级上调用 SuspendLayout()/ResumeLayout(),它仍然会抽搐。

当我改变控件的左侧位置和宽度时,如何阻止控件抽动?

【问题讨论】:

  • 试过 SetStyle(ControlStyles.UserPaint 或 ControlStyles.Opaque 或 ControlStyles.AllPaintingInWmPaint 或 ControlStyles.DoubleBuffer, True) ?
  • 是的,我试过 SetStyle(ControlStyles.ResizeRedraw, false); SetStyle(ControlStyles.Opaque, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true);仍然没有运气。

标签: c# winforms


【解决方案1】:

您可能想在移动/调整大小之前尝试在包含表单上调用Control.SuspendLayout(),然后调用Control.ResumeLayout()

听起来无论您将控件设置为哪种模式,当您更改边界时触发的某些事件都会在设置两个值之前重新绘制它。它可能与表格有关。

编辑:我在 SO 上看到了这个 similar question,您提到您已经使用过 SetStyle(),但也许您可以选择一些选项组合来获得所需的效果。

希望有帮助!

【讨论】:

  • 这是正确的方法。此外,您可以将控制锚定在右侧而不是左侧。但我怀疑这既是一种心理/生理现象,也是一种技术现象。
  • 不高兴,恐怕。这不是心理上的——在将左侧向右移动时,控件在其右侧绘制了一个小矩形;向右移动时,会留下一个未绘制的小矩形。
【解决方案2】:

这有帮助吗? http://richardsbraindump.blogspot.com/2007/09/how-to-create-flicker-free.html

我不知道你是否使用了带有这些参数的 SetStyle。

如果这没有帮助,我会删除答案,否则我会从 url 添加代码 sn-p。

【讨论】:

    【解决方案3】:

    与其进行实时调整大小,不如显示一个 sizer/ghost 矩形会更好。然后当用户鼠标向上时,调整一次控件的大小。

    这是一篇解释 Win32/C++ 方法的文章。
    http://www.dotnetheaven.com/Uploadfile/amitnabarro/resize_rt04082005085351AM/resize_rt.aspx

    您也许可以使用控件容器的 Graphics 对象来绘制一个没有闪烁的边界矩形。

    【讨论】:

    • 恐怕在这种情况下这不是一个选择。
    • 没问题,只是抛出想法。你永远不知道在某些情况下什么可能有效,什么无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2013-02-07
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多