【问题标题】:How to avoid screen flickering when a control must be constantly repainted in C#?当必须在 C# 中不断重绘控件时,如何避免屏幕闪烁?
【发布时间】:2008-10-08 22:19:29
【问题描述】:

我有一个简单的面板,用作绘图表面。这里的目标是在某些情况下围绕子 ListView 绘制一个 4 像素宽的轮廓。当可以将某些东西拖入其中时,我想让轮廓跳动。

我只是在 ListView 周围绘制一个简单的矩形,并在计时器滴答事件中更新矩形的不透明度。更改不透明度时,将重新绘制边框。此时我正在对这幅画进行双重缓冲。我也只允许每 15 次左右重绘一次(计时器间隔为 20 毫秒)。在这一切之后,绘图过程仍然有点闪烁。这是不可接受的,所以我需要一些关于如何避免这种情况的指导。

我看不到经常绘制控件的方法。需要有一个从不透明到实体的平滑过渡,然后再返回。当我足够降低滴答间隔(降低到大约 300 -500 毫秒)时,闪烁停止,但刷新率太慢。

我对任何想法持开放态度。也许我接近这个的方式是完全错误的,或者也许你们中的一个人已经创建了一个发光效果并且知道该怎么做。感谢您提前提供任何帮助。

【问题讨论】:

    标签: c# .net onpaint


    【解决方案1】:

    如果有人感兴趣,我偶然发现了一个解决方案。原来,闪烁是由背景的绘画引起的。我使用 SetStyle 告诉控件我将处理所有的绘画。

    SetStyle(ControlStyles.SupportsTransparentBackColor |
             ControlStyles.Opaque |
             ControlStyles.UserPaint |
             ControlStyles.AllPaintingInWmPaint, true);
    

    然后我首先在该区域上绘制透明颜色,然后绘制我的边框。我有点 hack,但它就像一个魅力。

    编辑:记住还要对图像进行双重缓冲。

    【讨论】:

      【解决方案2】:

      在表单上设置 DoubleBuffered = true。

      【讨论】:

        【解决方案3】:

        我没有一个强有力的答案,但既然你没有,我还是会发布:

        首先,我从未使用过 System.Drawing.ImageAnimator 类,但这对您来说是不是更好的方法?

        其次,如果失败了,您是否尝试过使用双缓冲?这是一个很长的镜头,但也许您的双缓冲代码实际上使情况变得更糟。

        【讨论】:

        • +1 因为你提醒我 ImageAnimator 类对我的另一个项目很有用。
        【解决方案4】:

        我很抱歉这可能无济于事:WPF 有动画,至少在理论上可以顺利地做到这一点。

        【讨论】:

          【解决方案5】:

          远射,但你试过了吗

          SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
          

          在面板控制上?

          【讨论】:

            【解决方案6】:

            您可能还想查看在位图上进行绘图,然后在位图发生更改时仅显示该位图。只是我的 2c。

            【讨论】:

            • 这是我一直在使用的双缓冲方式。
            猜你喜欢
            • 2013-05-02
            • 1970-01-01
            • 2010-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            相关资源
            最近更新 更多