从左到右移动文本的新闻行情
News ticker with moving text from left to right
我正在尝试制作一个显示文本的 rss 新闻自动收报机,文本需要从左向右移动
我制作了代码,文本从左向右移动,但在特定时间后它没有显示全文,我将从管理面板添加更多新闻,每次我添加新闻时,文本都是第一次滚动后不显示
下面的截图是在特定时间后,只显示了部分新闻
使用的代码
int x = -800,y=1;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
private void timer1_Tick(object sender, System.EventArgs e)
{
label1.SetBounds(x, y, 1, 1);
x++;
if(x>=800)
{
x = 4;
}
}
阅读代码xml
private void StartRssThread()
{
List<RssChannel> channels = new List<RssChannel>();
StringBuilder mergedFeed = new StringBuilder();
int mh = 0;
int ms = 0;
if (mh < 7)
{
RssFeed DaFeed = RssFeed.Read("http://shjc.ae/rss/fileName.xml");
RssChannel DaChannel = (RssChannel)DaFeed.Channels[0];
channels.Add(DaChannel);
mergedFeed.AppendFormat(" {0}: ", DaChannel.Title);
foreach (RssItem sTrm in DaChannel.Items)
{
if (ms < 10)
{
mergedFeed.AppendFormat(" {0} |", sTrm.Title);
ms++;
mh++;
}
}
}
string dafeed = mergedFeed.ToString();
mergedFeed = null;
textBox1.Invoke(new UpdateUiCallback(this.UpdateUi), new string[] { dafeed });
}
您正在为 x 的起始值和最大值使用硬编码值。根据您的问题,我认为标签中的文本具有动态长度(正确吗?)。如果文本是动态长度的,则 x 的值也应该是动态的。
此外,x 从 -800 开始。然后慢慢增长到 800,然后设置为 4。
这对我来说似乎很奇怪,如果第一个 运行 从 -800 开始,第二个 运行 可能也需要从 -800 开始。
希望这对您有所帮助。如果不是,请提供更多详细信息(例如您选择 -800、800 和 4 的原因)。
Windows 形成选取框标签 - 水平
我已经 post 编写了一个示例,说明如何使用 Timer
并重写post 中的自定义绘制控件:.
在下面的代码中,我更改了该示例,使文本从右到左或从左到右水平移动。设置控件的RightToLeft
属性就可以改变方向了。也不要忘记将 AutoSize
设置为 false
.
示例 - Windows 表格中从右到左和从左到右的选取框标签
using System;
using System.Drawing;
using System.Windows.Forms;
public class MarqueeLabel : Label
{
Timer timer;
public MarqueeLabel()
{
DoubleBuffered = true;
timer = new Timer() { Interval = 100 };
timer.Enabled = true;
timer.Tick += Timer_Tick;
}
int? left;
int textWidth = 0;
private void Timer_Tick(object sender, EventArgs e)
{
if (RightToLeft == RightToLeft.Yes)
{
left += 3;
if (left > Width)
left = -textWidth;
}
else
{
left -= 3;
if (left < -textWidth)
left = Width;
}
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(BackColor);
var s = TextRenderer.MeasureText(Text, Font, new Size(0, 0),
TextFormatFlags.TextBoxControl | TextFormatFlags.SingleLine);
textWidth = s.Width;
if (!left.HasValue) left = Width;
var format = TextFormatFlags.TextBoxControl | TextFormatFlags.SingleLine |
TextFormatFlags.VerticalCenter;
if (RightToLeft == RightToLeft.Yes)
{
format |= TextFormatFlags.RightToLeft;
if (!left.HasValue) left = -textWidth;
}
TextRenderer.DrawText(e.Graphics, Text, Font,
new Rectangle(left.Value, 0, textWidth, Height),
ForeColor, BackColor, format);
}
protected override void Dispose(bool disposing)
{
if (disposing)
timer.Dispose();
base.Dispose(disposing);
}
}
我正在尝试制作一个显示文本的 rss 新闻自动收报机,文本需要从左向右移动
我制作了代码,文本从左向右移动,但在特定时间后它没有显示全文,我将从管理面板添加更多新闻,每次我添加新闻时,文本都是第一次滚动后不显示
下面的截图是在特定时间后,只显示了部分新闻
使用的代码
int x = -800,y=1;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
private void timer1_Tick(object sender, System.EventArgs e)
{
label1.SetBounds(x, y, 1, 1);
x++;
if(x>=800)
{
x = 4;
}
}
阅读代码xml
private void StartRssThread()
{
List<RssChannel> channels = new List<RssChannel>();
StringBuilder mergedFeed = new StringBuilder();
int mh = 0;
int ms = 0;
if (mh < 7)
{
RssFeed DaFeed = RssFeed.Read("http://shjc.ae/rss/fileName.xml");
RssChannel DaChannel = (RssChannel)DaFeed.Channels[0];
channels.Add(DaChannel);
mergedFeed.AppendFormat(" {0}: ", DaChannel.Title);
foreach (RssItem sTrm in DaChannel.Items)
{
if (ms < 10)
{
mergedFeed.AppendFormat(" {0} |", sTrm.Title);
ms++;
mh++;
}
}
}
string dafeed = mergedFeed.ToString();
mergedFeed = null;
textBox1.Invoke(new UpdateUiCallback(this.UpdateUi), new string[] { dafeed });
}
您正在为 x 的起始值和最大值使用硬编码值。根据您的问题,我认为标签中的文本具有动态长度(正确吗?)。如果文本是动态长度的,则 x 的值也应该是动态的。
此外,x 从 -800 开始。然后慢慢增长到 800,然后设置为 4。 这对我来说似乎很奇怪,如果第一个 运行 从 -800 开始,第二个 运行 可能也需要从 -800 开始。
希望这对您有所帮助。如果不是,请提供更多详细信息(例如您选择 -800、800 和 4 的原因)。
Windows 形成选取框标签 - 水平
我已经 post 编写了一个示例,说明如何使用 Timer
并重写post 中的自定义绘制控件:
在下面的代码中,我更改了该示例,使文本从右到左或从左到右水平移动。设置控件的RightToLeft
属性就可以改变方向了。也不要忘记将 AutoSize
设置为 false
.
示例 - Windows 表格中从右到左和从左到右的选取框标签
using System;
using System.Drawing;
using System.Windows.Forms;
public class MarqueeLabel : Label
{
Timer timer;
public MarqueeLabel()
{
DoubleBuffered = true;
timer = new Timer() { Interval = 100 };
timer.Enabled = true;
timer.Tick += Timer_Tick;
}
int? left;
int textWidth = 0;
private void Timer_Tick(object sender, EventArgs e)
{
if (RightToLeft == RightToLeft.Yes)
{
left += 3;
if (left > Width)
left = -textWidth;
}
else
{
left -= 3;
if (left < -textWidth)
left = Width;
}
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(BackColor);
var s = TextRenderer.MeasureText(Text, Font, new Size(0, 0),
TextFormatFlags.TextBoxControl | TextFormatFlags.SingleLine);
textWidth = s.Width;
if (!left.HasValue) left = Width;
var format = TextFormatFlags.TextBoxControl | TextFormatFlags.SingleLine |
TextFormatFlags.VerticalCenter;
if (RightToLeft == RightToLeft.Yes)
{
format |= TextFormatFlags.RightToLeft;
if (!left.HasValue) left = -textWidth;
}
TextRenderer.DrawText(e.Graphics, Text, Font,
new Rectangle(left.Value, 0, textWidth, Height),
ForeColor, BackColor, format);
}
protected override void Dispose(bool disposing)
{
if (disposing)
timer.Dispose();
base.Dispose(disposing);
}
}