C#中的平滑文本滚动

时间:2010-10-08 19:36:32

标签: c# text scroll

我希望在我的c#窗体上有能够顺畅滚动 的文字。

我试图定义带有文字的标签,逐个像素地移动,但它不是平滑的,因为它就像在flash中创建的动画一样。

我怎样才能设法获得如此流畅的动画?

提前谢谢你!

3 个答案:

答案 0 :(得分:6)

我试过这个,我有一些好消息和一些坏消息。

好消息是有可能。我现在正在测试代码,即使使用GDI +,我也可以实现绝对柔滑的文本滚动。

困难的部分是,您必须确保/实施相当多的事情:

  1. 在渲染表面(例如表单)上将DoubleBuffered设置为true。
  2. 你必须亲自绘制文字, Label类不会这样做(参见 下一点为什么)。
  3. 您需要浮点解析 在你的绘图(定位)代码中, 这意味着你必须使用 TextRenderingHint.AntiAlias在你的 DrawString()调用和更大的字体大小(> 10-12 pt)使它看起来很好。
  4. 你需要一个非常高的分辨率 计时器组件。我正在使用 基于Win32多媒体的组件 允许的winmm.dll中的计时器 定时器事件率高达1000赫兹和 几乎绝对准确(标准 偏差低于0.1毫秒)。谷歌为 MultimediaTimer组件。 (顺便说一句,我知道它不再是MS推荐的解决方案,但即使在Windows 7中它也能完美运行。)
  5. 此外,Windows多媒体计时器 具有毫秒级的分辨率 不能给你完美的60赫兹 刷新(1000/60不是整数), 所以你需要实现一些 一种浮点显示 刷新计数机制得到 接近显示刷新率为 可能。顺便说一句 的

    float tickCount = 0.0f;
    float tickDelta = 1000.0f / 60.0f;
    
    
    void mmTimer_Tick(object sender, EventArgs e)
    {
        tickCount++;
        if (tickCount >= tickDelta)
        {
            tickCount -= tickDelta;
            // scroll your text here 
            Invalidate();
        }
    }
    

    会做。

  6. 最后,一些轻微的撕裂可能 偶尔发生。这是所有的了 但不可避免,因为你没有 访问垂直同步视频 寄存器。试验时间 消除撕裂。

  7. 老实说,我希望这会有所帮助。如果你在实施它时遇到任何问题,请告诉我。

答案 1 :(得分:0)

我认为你使用双缓冲,因为没有它,你的文字会闪烁,看起来不会很好。

你可能有GDI的问题,那就是你的移动速度与监视器刷新率没有同步。

例如,如果你有60Hz液晶显示器,你应该每1000/60毫秒更新一次文本位置,但是如果你使用计时器,你会偶尔遇到急动。

答案 2 :(得分:0)

如果覆盖表单上的只读属性CreateParams,并向params添加WX_COMPOSITE(0x2000000,我认为它是复合的)。这仅适用于XP及更高版本,但它会停止闪烁,而DoubleBuffer则不会。