我正在尝试制作一个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 });
}
答案 0 :(得分:1)
您将硬编码值用于x的开始和最大值。根据您的问题,我认为标签中的文本具有动态长度(正确吗?)。如果文本的长度是动态的,则x的值也应该是动态的。
此外,x从-800开始。然后慢慢增长到800,然后将其设置为4。 对于我来说,这很奇怪,如果第一次运行是从-800开始的,那么第二次运行可能也需要从-800开始。
希望这对您有所帮助。如果没有,请提供更多详细信息(例如为什么选择-800、800和4)。
答案 1 :(得分:0)
我已经发布了一个示例,该示例通过使用Timer
并覆盖自定义绘制控件的OnPaint
方法来创建字幕标签以使文本从上到下进行动画处理: Windows Forms Top to Bottom Marquee Label。
在以下代码中,我更改了该示例,以使文本从右到左或从左到右水平设置动画。只需设置控件的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);
}
}