星球大战风格文本滚动器






4.73/5 (45投票s)
3D 风格的文本滚动控件(
引言
您可以在许多程序中找到文字滚动条,尤其是在它们的“关于”对话框中。在大多数情况下,它只是一个向上移动的简单彩色文本。在本文中,我试图创造一些不寻常的东西。我决定编写一个“向外”的文本组件,看起来像一个 3D 效果,例如在星球大战电影的开场白中。
GDI+ 提供了许多易于使用的对象和函数。使用这些函数,您无需太多麻烦即可完成一些特殊的事情。在借助 GDI+ 编写此组件之前,我尝试使用 GDI 创建它。这需要更多的时间,并导致代码量增加了十倍。这似乎是一项艰巨的任务,但后来我用 GDI+ 重新创建了这个相同的组件。那很容易。在那之后,我决定写这篇文章来演示 GDI+ 的一些功能。
我们如何做到这一点
我们可以通过将文本的所有点从矩形转换为梯形来创建这种“向外”效果
为了使我们的转换文本产生动画效果,我们将使用一个偏移变量和一个计时器。在计时器滴答声中,我们将更改此变量并重新绘制控件。
代码
最有用的代码位于 Paint
事件处理程序中。首先,我们需要启用抗锯齿以获得更好的质量
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
之后,我们擦除背景以清除之前的帧
e.Graphics.FillRectangle(new SolidBrush(this.BackColor),
this.ClientRectangle);
然后,我们创建一个 GraphicsPath
对象,并根据偏移量用可见的文本行填充它
GraphicsPath path = new GraphicsPath();
for (int i = m_text.Length - 1; i >= 0; i--)
{
Point pt = new Point((int)
((this.Width - e.Graphics.MeasureString(m_text[i],
this.Font).Width) / 2), (int)(m_scrollingOffset +
this.Height - (m_text.Length - i) * this.Font.Size));
// Adds visible lines to path.
if ((pt.Y + this.Font.Size > 0) && (pt.Y < this.Height))
path.AddString(m_text[i], new FontFamily("Arial"),
(int)FontStyle.Bold, this.Font.Size,
pt, StringFormat.GenericDefault);
}
之后,我们将我们的 GraphicsPath
从矩形转换为梯形
path.Warp(new PointF[4]
{
new PointF(this.Width / 3, 0),
new PointF(this.Width * 2 / 3, 0),
new PointF(0, this.Height),
new PointF(this.Width, this.Height)
},
new RectangleF(this.ClientRectangle.X,
this.ClientRectangle.Y, this.ClientRectangle.Width,
this.ClientRectangle.Height),
null, WarpMode.Perspective);
文本现在已经准备好了。接下来,我们需要绘制它并处理 GraphicsPath
对象
// Draws wrapped path.
e.Graphics.FillPath(new SolidBrush(this.ForeColor), path);
path.Dispose();
为了使控件更逼真,我们可以使用带有透明颜色的 LinearGradientBrush
绘制一些“雾”
// Draws fog effect with help of gradient brush with alpha colors.
using (Brush br = new LinearGradientBrush(new Point(0, 0),
new Point(0, this.Height),
Color.FromArgb(255, this.BackColor), Color.FromArgb(0,
this.BackColor)))
{
e.Graphics.FillRectangle(br, this.ClientRectangle);
}
使用代码
Scroller
类表示一个易于使用的组件,具有可自定义的字体、背景颜色、文本颜色,当然还有文本内容。您可以简单地将 Scroller
类复制到您的项目中以使用它。此外,您可以为 Scroller
类创建一个单独的类库。
Scroller 控件的属性
此控件具有以下属性
TextToScroll
– 此文本将根据\n
符号分成多行BackColor
– 背景颜色ForeColor
– 文本颜色Interval
- 帧之间以毫秒为单位的延迟,用于控制滚动速度TextFont
- 用于绘制的字体;单位必须设置为GraphicsUnit.Pixel
TopPartSizePercent
- 文本的顶部大小,以控件宽度的百分比表示
Scroller 控件的方法
Start()
– 从头开始启动动画Stop()
– 停止动画
关注点
当我创建此控件时,我注意到 GraphicsPath
类可以在您需要对图形对象(包括点变换)进行一些特定变换的情况下为您提供帮助。
免责声明
您可以在任何类型的项目中使用此代码,无论是免费的还是商业的。如果您这样做,请在您的代码注释或“关于”对话框中添加指向本文的链接。
感谢您的阅读,并感谢所有帮助我改进这篇文章的人。
历史
- 2007 年 7 月 9 日 - 发布第一个更新版本
- 修复了文本偏移的错误:现在将
Font Units
设置为GraphicsUnit.Pixel
- 添加了循环滚动功能
- 添加了
Interval
属性 - 添加了
TextFont
属性 - 添加了
TopPartSizePercent
属性
- 修复了文本偏移的错误:现在将
- 2007 年 5 月 16 日 - 发布原始版本