【问题标题】:c# double buffering buttonsc# 双缓冲按钮
【发布时间】:2011-12-08 13:05:58
【问题描述】:

过去几个月我一直在做一个项目,但遇到了一个我无法解决的问题。我有一个带有控件的 Windows 窗体。当用户更改控件大小时,应用程序会触发 sizechanged 事件,然后我相应地在其上移动控件。主要问题在于按钮,因为它们有图像 - 实际上更准确地说 - 它们是平坦的,没有边框,并且上面有一个实际上是绘制按钮的图像(我不通过代码绘制它的原因是因为图像很复杂)。在某些机器上,当应用程序调整大小时,它们开始闪烁。 Form 设置为 DoubleBuffered true,我已经使用此函数在按钮上设置双缓冲。

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
    {
        if (System.Windows.Forms.SystemInformation.TerminalServerSession)
            return;

        System.Reflection.PropertyInfo aProp =
              typeof(System.Windows.Forms.Control).GetProperty(
                    "DoubleBuffered",
                    System.Reflection.BindingFlags.NonPublic |
                    System.Reflection.BindingFlags.Instance);

        aProp.SetValue(c, true, null);
    }

有什么建议吗?

【问题讨论】:

  • 当表单调整大小时,您是使用任何自定义代码来处理调整大小事件还是仅使用默认代码?如果是自定义的,您是否在调整所有控件的大小或移动控件时暂停表单的布局?
  • 我正在使用自定义代码,并没有使用 SuspendLayout,但我现在已经尝试过了,据我所知,同样的事情发生了(必须在另一台计算机上测试才能看到更多清楚地)。我有大约 10 个按钮,我在 SizeChanged 事件中更改它们的左侧和顶部。
  • Button 类已经开启了双缓冲。您的问题出在其他地方。
  • 该主题中列出的一些方法会导致我的绘画方法出现许多错误,因此我需要进一步测试它。

标签: c# winforms doublebuffered


【解决方案1】:

当我遇到双缓冲问题时,这对我有很大帮助。代码有点旧,但仍然涵盖了基础知识。

http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx

希望对您有所帮助。 :)

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 2011-10-16
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2014-04-07
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多