繁体   English   中英

在C#中流畅地滚动文本

[英]Smooth text scrolling in C#

我想在C#Windows窗体上平滑滚动的文本。

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

我如何才能获得如此流畅的动画?

先感谢您!

我已经尝试过这样做,并且我有一些好消息和一些坏消息。

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

困难的部分是必须确保/实施很多事情才能拥有它:

  1. 在渲染表面(例如,窗体)上将DoubleBuffered设置为true。
  2. 您必须自己绘制文本,Label类不会这样做(请参阅下一个原因)。
  3. 您需要在绘图(定位)代码中使用浮点分辨率,这意味着您必须在DrawString()调用中使用TextRenderingHint.AntiAlias并使用较大的字体(> 10-12 pt)以使其看起来不错。
  4. 您需要一个非常高分辨率的计时器组件。 我在winmm.dll中使用基于Win32多媒体计时器的组件,该组件允许高达1000 Hz的计时器事件发生率以及几乎绝对的准确性(低于0.1 ms的标准偏差)。 Google for MultimediaTimer组件。 (顺便说一句,我知道它已不再是MS推荐的解决方案,但即使在Windows 7中也能正常使用。)
  5. 此外,Windows多媒体计时器具有毫秒级的分辨率,无法为您提供完美的60 Hz刷新(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. 最后,偶尔会发生一些轻微的撕裂。 这几乎是不可避免的,因为您无权访问垂直同步视频寄存器。 尝试定时以消除撕裂。

老实说,我希望这会有所帮助。 让我知道您在实施它时是否遇到任何问题。

我假设您使用双缓冲,因为如果没有它,您的文本将闪烁并且根本看起来不会很好。

GDI可能存在问题,那就是您的移动速度未与监视器刷新率同步。

例如,如果您有60Hz的LCD监视器,则应该每1000/60毫秒更新一次文本位置,但是如果使用计时器,则会时不时地出现混乱。

如果您在表单上覆盖了只读属性CreateParams,并将WX_COMPOSITE(0x2000000,我认为是Composite)添加到参数中。 这仅适用于XP和更高版本,但在DoubleBuffer不起作用时会停止闪烁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM