I'm making a running text software where there is some text that runs alternately in the marqueelabel control. I wanted at every turn of the text, the background of marqueelabel will be blinking.
I use three timer control, ie two System.Windows.Forms.Timer (Timer1 and timer2) and one System.Timers.Timer (elapsedTime). Timer1 is used to replace the text that goes in a certain duration. timer2 desired for the blink The text for 2 seconds set by elapsedTime. all went well, except the text does not blink every turn of the text as i expected.
Here is the code :
using System;
using System.Timers;
using System.Threading;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace RunningText
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
private Dictionary<int,textData> dict = new Dictionary<int,textData>();
private string[] textContent;
private string[] textDuration;
private int textCount = 0;
private int textIdx = 0;
private System.Timers.Timer elapsedTime;
struct textData
{
public string content;
public int duration;//in second
}
public MainForm()
{
InitializeComponent();
fillData();
timer1.Start();
loadText();
}
public void fillData()
{
textData td;
td.content = "Love means never having to say you're sorry";
td.duration = 15;
dict.Add(0,td);
td.content = "A long time ago, in a galaxy far, far away...";
td.duration = 20;
dict.Add(1,td);
td.content = "Just when you thought it was safe to go back in the water...";
td.duration = 15;
dict.Add(2,td);
}
public void loadText()
{
textCount = dict.Count;
if(textCount > 0)
{
textContent = new string[textCount];
textDuration = new string[textCount];
for(int i=0;i<textCount;i++)
{
textContent[i] = dict[i].content;
textDuration[i] = dict[i].duration.ToString();
}
textIdx = 0;
showText(textContent[textIdx],textDuration[textIdx]);
}
}
private void showText(string content,string duration)
{
timer1.Stop();
timer2.Stop();
marqueeLabel1.Text = content;
int second = Convert.ToInt32(duration) * 1000;
timer1.Interval = second;
timer1.Start();
elapsedTime = new System.Timers.Timer(10000);
elapsedTime.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
elapsedTime.Interval = 2000;
elapsedTime.AutoReset = true;
elapsedTime.Start();
timer2.Tick += blinkLabel;
timer2.Interval = 200;
timer2.Start();
}
void Timer1Tick(object sender, EventArgs e)
{
if(textCount > 0)
{
textIdx++;
if(textCount == textIdx)
{
textIdx = 0;
}
showText(textContent[textIdx],textDuration[textIdx]);
}
}
private void blinkLabel(object sender, EventArgs e)
{
if (marqueeLabel1.BackColor == Color.White)
marqueeLabel1.BackColor = Color.Gold;
else
marqueeLabel1.BackColor = Color.White;
}
private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
timer2.Stop();
elapsedTime.Stop();
marqueeLabel1.BackColor = Color.White;
}
}
the complete file and the marqueelabel control can be found here : http://www.ziddu.com/download/21091002/RunningText.zip.html