我正在使用 MSVB2005。我想编写一个用户控件,它是一个自动文本滚动器,以平滑的方式垂直滚动固定文本,例如逐个像素(而不是逐行)。这也称为Marquee(例如,在 HTML 中)。
我已经使用计时器实现了这样的控件,在它的每个滴答声中,文本都被渲染到控件的表面上 1 个像素。它工作得很好,但是消耗了相当多的 CPU 功率,因为没有使用图形硬件加速,并且所有渲染计算都“落在”主 CPU 上。
我想通过使用内置于操作系统(即 Windows)中的图形机制来提高控件的性能,例如 Form/Control 垂直滚动条。我很确定操作系统在下面使用硬件加速。
我认为我的用户控件可以继承自ScrollableControl类,也可以继承自另一个继承ScrollableControl的类,例如Panel。我这样做了,并且在上述计时器的每个滴答声中 - 执行以下操作:
Y += 1
Me.AutoScrollPosition = New Point(0, Y)
whereY
是一个类成员,因此在每个计时器滴答声中增加一个。这也很好用,但是:
1)仅当每次调用控件的OnPaint
事件处理程序时都执行文本呈现。如果是这样... 这种形式的解决方案获得了什么?(文本渲染似乎是消耗大部分 CPU 时间的部分)
有没有办法只将整个文本渲染一次到控件的表面,并让操作系统完全管理滚动,即让操作系统在垂直滚动条的每次移动时自动重绘控件的可见区域(无需自行重绘每次调用OnPaint时文本的相关部分)?
2)垂直滚动条可见。我需要它处于活动状态但不可见。
你的帮助将非常有义务。
附言
该控件适用于 Winforms 应用程序,因此我现在无法切换到 WPF。我不熟悉 DirectX 和 OpenGL,而且短期内也没有时间学习这些技术。因此,目前,任何这些方向的解决方案都不被认为是可行的。谢谢。