星球大战风格的文字滚动图片框





4.00/5 (2投票s)
星球大战风格的文字滚动图片框
引言
还记得《星球大战》片头那些炫酷的图形吗?嗯,这里有一个类似的东西。只需把一些文本扔给它,然后让它动起来。它是一个图片框`TextCrawler`,集多种功能于一身!(你可能需要自己动手做一些事情,而且它不擦窗户……好吧。不是一个女仆,但还是很酷。)
背景
我离开任何不是高级打字机的电脑已经七年多了(在我那颠簸的床铺附近有马桶,窗户被混凝土或难看的铁条遮得严严实实,我唯一的门上还有一扇窗……好吧,我坐过牢,来告我啊!)所以现在,在七年渴望编码的痛苦和煎熬之后,我终于有了笔记本电脑和自由来做这件事。
不过抱歉。不,没有监狱暴动,没有高调越狱之类的,只是在我开始在一个地方做厨师的前几天,一个家伙在周二的厨房里被捅得太厉害,以至于我在一个阳光明媚的周六早上煎鸡蛋的时候,他死在了医院里。
但不管怎么说,这是一个监狱笑话
你怎么知道监狱里的食物不好?看看厨房里所有的警卫!
无论如何,这些年来我一直渴望写代码,现在我终于有了笔记本电脑,我在这里了。我读了一本80年代写的关于3D图形的书,现在我迫不及待地想开始!
Using the Code
以下是 `TextCrawler` 类的主要功能
//
//
public void ScrollText(string str, Font fnt, double dblAngle, Color clrText)
public List<classTextCrawl.classScrollLine>
textToTiltScrollBmpArray(string strText,
Font fnt,
Color clrForeColor,
Color clrBackGroundColor,
bool bolTransparent,
double dblAngle,
int intMaxCharPerLine)
public classScrollLine tiltImageBack(Bitmap bmpSource, double dblAngle)
//
唯一可能需要将某些内容显示在屏幕上的功能是 `ScrollText()` 函数,因为它为您做所有事情。`ScrollText()` 使用另外两个函数。它以类似于文字处理器“自动换行”功能的方式将文本解析成独立的行,这样行末就不会切断单词或在新行开头绘制逗号。然后它将这些文本字符串发送到 `TextToTiltScrollBmpArray()`,该函数将字符串数组转换为每行文本的“倾斜”图像位图数组。
这是本演示应用程序中的示例调用
private void btnGo_Click(object sender, EventArgs e)
{
go();
}
void go()
{
cTextCrawl.ScrollText(strText, fnt, ((double)intAngle / 180.0 * Math.PI), clrText);
}
该死,真整洁!
这就像在空荡荡的停车场里代客泊车!
你唯一需要做的是将源文件 *TextCrawl.cs* 复制到与其余 *.cs* 文件相同的目录中,并在代码中实例化该类,就像它是一个 `picturebox` 一样。
classTextCrawl cTextCrawl = new classTextCrawl();
public formTextCrawlDemonstration()
{
InitializeComponent();
Controls.Add(cTextCrawl);
cTextCrawl.Dock = DockStyle.Fill;
cTextCrawl.BackgroundImage = Properties.Resources.starry_night;
cTextCrawl.BackgroundImageLayout = ImageLayout.Center;
initCmb();
resetControls();
}
它只使用一个类
public class classScrollLine
它保存了显示在屏幕上的每行图形文本的相关数据。“倾斜”的东西。
在滚动过程中,开发者可以控制的唯一不需要重新生成图像的东西是类继承的输出图片框的大小以及运行它的计时器的间隔。除此之外,你必须停止滚动并重新开始。这就是这个演示应用程序所展示的。你有用于角度和计时器延迟间隔的滚动条,用于调用各自对话框的字体和颜色按钮,以及一个组合框,其中列出了我出版的一些小说中的精选文本(在监狱里除了看电视、去健身房和吃垃圾食品之外,也没什么好做的)。组合框还允许你加载一个 .txt 文件并将其用作源字符串,或者它可以为你提供一个文本框来写下缪斯女神可能带来的灵感。如果你把字体大小设置得太大,那么它会尝试每行只绘制一个字符,我不会浪费时间去解决这个问题,所以演示中的对话框将大小限制在 20-50 之间。如果你低于 14,就会出现奇怪的结果。但是,`TextCrawler` 类会让你自己去搞砸它。如果你想要一个拥挤在一起且斑驳的小字体,或者一个巨大的问题,你就尽管去做。但我建议你保持在 14 到 48 之间。至于颜色的选择,如果你尝试将前景绘制成你选择的透明颜色,那么显然你将什么也看不到,只能看到过去的项目的幻影。实际上,你只会看到很少的东西。什么都没有。如果你喜欢冥想,就试试看,只需记住哼唱神圣的词语“oooooohmmm”。
尽管本演示中的用户界面显示你选择的角度是度数而不是弧度,但类本身使用的是弧度。15 到 135 度(0.261799 到 2.356194 弧度)之间的任何角度都能产生不错的效果。
所以前景不要和背景一样是白色,字体大小保持在14到48之间,你就大功告成了。
如果您从组合框中选择四个文本中的一个,滚动将立即开始,否则您必须按下我上面提到的那个著名的“开始”按钮。
工作原理
我之前确实谈到 `TextCrawl` 类如何接收一个文本 `string`,然后将其转换为 `string` 数组,每个 `string` 都被制作成图形。在应用程序使用
TextRenderer.DrawText(g,
strTextLine,
fnt,
new Point(recDestination.X,
recDestination.Y),
clrForeColor,
clrBackGroundColor,
TextFormatFlags.Default | TextFormatFlags.NoPrefix);
`System.Windows.Forms` 函数将字符串转换为图形,以及滚动文本在屏幕上滚动的时间之间发生的事情,实际上是一个相当简单的概念。它获取那些像草原公路一样平坦的二维图形图片,然后重新绘制它们。重新绘制它们并不那么复杂。这个想法像一个拿着尺子的女老师一样击中了我,我连续两天不停地(几乎)投入其中,因为它是一个如此简单的算法。它获取原始图形文本的每一行,并将它们重新绘制到另一个相同大小的位图上,但只逐渐增加每行像素的宽度,因为它从上到下移动(尽管这对于 0-90 度之间的角度是正确的,对于 90-180 度之间的角度则相反)。因此,结果的“倾斜”图像看起来像下面的图像
这就是它生成在屏幕上爬行的图像所需要做的所有事情。
接下来它需要做的是实际将它们放置在屏幕上。最初我以为任何来自堪萨斯州Backscratch的人都可以在两分钟内完成,那为什么还要把它包含在应用程序中呢……不。不,我花了一段时间。我做过类似的事情。一个`textcrawl`,它使用弧度坐标来定义我自己的块状字体,然后它径向协调屏幕上每个字符的每一行来倾斜它们,就像这些一样!它非常慢,产生的效果也不够专业,但我为自己能够在一个没有互联网、不知道如何像今天这样操作位图的时候实现了我能想到的唯一算法而感到自豪。
无论如何,这是我出狱的第一周,我已经七年没见过我美丽的IDE了,尽管我渴望,但这就像一只腿断了的蜥蜴痛苦地蹒跚着等待它重新长出来一样,我努力应对语法和C#2010到C#2017之间发生的变化。但尽管如此,我只花了两天就完成了。
将这些倾斜文本图像的行向上移动屏幕所涉及的概念与我上面提到的文本图像的倾斜类似。您所要做的就是假装文本行(图形图像)是像素行。调整它们的宽度是它们在屏幕上垂直位置的函数,而它们的高度是纵横比的问题(我为这个问题挣扎了几个小时……然后灵光一闪!当然是纵横比!)所以,就是这样,真的。没什么大不了的。一个简单的解决方案,七年牢狱和七天自由之后,效果相当酷。
我有个主意
今天我想到一个很酷的点子。利用这个 `TextCrawler` 的概念,我想我可能会创建一个跳跃的文本运动效果,文字会从屏幕底部远处倒置并像镜面一样地跳出来,这样看起来就像你看到字母向你跳跃,然后随着它们逐渐向上移动,它们的高度会缩小但宽度会增加,直到它们只有一像素高,此时它们会像敌方城墙上的炮火,或者你的高中英语老师那样,向你倾泻而下。
它只是两个透明的 `TextCrawler` 叠加在一起……无论如何,我有七年的项目想法要实现,一些旧代码要复活,而且目前有太多想法,以至于无法专注于那一个。
有任何问题,尽管给我写信。