65.9K
CodeProject 正在变化。 阅读更多。
Home

星球大战风格文本滚动器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (45投票s)

2007年5月16日

CPOL

3分钟阅读

viewsIcon

152068

downloadIcon

3304

3D 风格的文本滚动控件(类似星球大战电影片头)

Screenshot - preview.jpg

引言

您可以在许多程序中找到文字滚动条,尤其是在它们的“关于”对话框中。在大多数情况下,它只是一个向上移动的简单彩色文本。在本文中,我试图创造一些不寻常的东西。我决定编写一个“向外”的文本组件,看起来像一个 3D 效果,例如在星球大战电影的开场白中。

GDI+ 提供了许多易于使用的对象和函数。使用这些函数,您无需太多麻烦即可完成一些特殊的事情。在借助 GDI+ 编写此组件之前,我尝试使用 GDI 创建它。这需要更多的时间,并导致代码量增加了十倍。这似乎是一项艰巨的任务,但后来我用 GDI+ 重新创建了这个相同的组件。那很容易。在那之后,我决定写这篇文章来演示 GDI+ 的一些功能。

我们如何做到这一点

我们可以通过将文本的所有点从矩形转换为梯形来创建这种“向外”效果

Transform process.

为了使我们的转换文本产生动画效果,我们将使用一个偏移变量和一个计时器。在计时器滴答声中,我们将更改此变量并重新绘制控件。

代码

最有用的代码位于 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 日 - 发布原始版本
© . All rights reserved.