【问题标题】:How to eliminate flicker in Windows.Forms custom control when scrolling?滚动时如何消除Windows.Forms自定义控件中的闪烁?
【发布时间】:2010-09-09 00:29:55
【问题描述】:

我想在 C# 中创建一个自定义控件。但每次我必须完全重绘我的控件时,它都会闪烁,即使我使用双缓冲(先绘制到图像,然后再进行 blitting)。

当我必须完全重绘时如何消除闪烁?

【问题讨论】:

    标签: c# .net winforms gdi+


    【解决方案1】:

    您说您已经尝试过双缓冲,但是您说先绘制到图像并对其进行传输。您是否尝试过在构造函数中设置 DoubleBuffered = true 而不是自己使用 Image 进行设置?

    【讨论】:

      【解决方案2】:

      您可以尝试在 InitiliseComponent 调用之后将以下内容放入您的构造函数中。

      SetStyle(ControlStyles.OptimizedDoubleBuffer | 
               ControlStyles.UserPaint |
               ControlStyles.AllPaintingInWmPaint, true);
      

      编辑:

      如果您尝试这样做,如果可以的话,请删除您自己的双缓冲代码,并让控件自行绘制以响应被调用的适当虚拟方法。

      【讨论】:

      • 我通常把这些东西放在 Application.Run 之前,但我认为这是解决这个问题的最佳方法。
      • 我同意。我还在另一个与闪烁相关的问题中找到了一个很好的网址。 codeproject.com/KB/graphics/DoubleBuffering.aspx
      • 我已经尝试了很多不同的解决方案,但这解决了它! +1 用于告诉将其放在 InitializeComponent() 之后; !! xoxoxo
      【解决方案3】:

      打个电话就够了

      SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
      

      您看到的闪烁很可能是因为 Windows 首先绘制控件的背景(通过 WM_ERASEBKGND),然后要求您的控件执行您需要执行的任何绘制(通过 WM_PAINT)。通过禁用背景绘制并在 OnPaint 覆盖中执行所有绘制,可以在 99% 的情况下消除问题,而无需使用双缓冲所需的所有内存。

      【讨论】:

        【解决方案4】:

        我从一个工作的 C# 程序中提取了这个。其他海报有语法错误,并且明显是从 C++ 而不是 C# 复制的

        SetStyle(ControlStyles.OptimizedDoubleBuffer | 
                                ControlStyles.UserPaint |
                                ControlStyles.AllPaintingInWmPaint, true);
        

        【讨论】:

          猜你喜欢
          • 2011-07-06
          • 2015-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          • 1970-01-01
          • 2018-06-20
          相关资源
          最近更新 更多