[C# Control] 走马灯(Marquee)
本来打算自己用Graphics.DrawString的,但是发现效果没有直接利用Label的好
代码没什么可研究的,不过效果似乎还不错

/**////////////////////////////////////////////////////////////////////////////////
// Marquee.cs
// 走马灯
//
// @remarks For study purpose
//
// @author Icebird @date 2006-06-22

/**////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ControlsEx


{

/**//// <summary>
/// 走马灯
/// </summary>
public class Marquee : System.Windows.Forms.Control

{

/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;


/**//// <summary>
/// Constructor
/// </summary>
public Marquee()

{
InitializeComponent();
}


/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )

{
if( disposing )

{
if( components != null )

{
components.Dispose();
timer.Stop();
timer.Dispose();
lbl.Dispose();
}
}
base.Dispose( disposing );
}

private Timer timer;
private Label lbl;


组件设计器生成的代码#region 组件设计器生成的代码

/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()

{
components = new System.ComponentModel.Container();
lbl = new Label();
lbl.Parent = this;
lbl.AutoSize = true;
lbl.Visible = false;

timer = new Timer(components);
timer.Tick +=new EventHandler(timer_Tick);
Speed = 1;
timer.Start();
}
#endregion


/**//// <summary>
/// 字体
/// </summary>
public override Font Font

{
get

{
return base.Font;
}
set

{
base.Font = value;
lbl.Font = value;
}
}


/**//// <summary>
/// 显示文字,用'|'分隔信息
/// </summary>
public override string Text

{
get

{
return base.Text;
}
set

{
base.Text = value;

infos = value.Split(new char[]
{'|'});
if (infos.Length > 0)

{
index = 0;
lbl.Text = infos[0];
}
else
lbl.Text = value;
offset = -2;
lbl.Top = (ClientSize.Height - lbl.Height) / 2;
}
}

protected override void OnResize(EventArgs e)

{
base.OnResize (e);
lbl.Top = (ClientSize.Height - lbl.Height) / 2;
}

protected override void OnEnabledChanged(EventArgs e)

{
base.OnEnabledChanged (e);

lbl.Visible = Enabled;
if (Enabled)
timer.Start();
else
timer.Stop();
}

private int offset;
private int index;

private void timer_Tick(object sender, EventArgs e)

{
if (!Enabled)
return;
offset++;
int newLeft = Width - offset;
lbl.Left = newLeft;
if (lbl.Text.Length > 0)
lbl.Visible = true;
lbl.Invalidate();

if (newLeft + lbl.Width < 0)

{
//显示下一条
offset = -2;
index++;
if (index >= infos.Length)
index = 0;
if (Width > 4)
lbl.Left = Width;
lbl.Text = infos[index];
}
}

private string[] infos;


/**//// <summary>
/// 滚动速度,范围1~10,1最快,10最慢
/// </summary>
public int Speed

{
get

{
return timer.Interval / 20;
}
set

{
if (value < 1 || value > 10)
return;
timer.Stop();
timer.Interval = value * 20;
timer.Start();
}
}
}
}

代码没什么可研究的,不过效果似乎还不错

/**////////////////////////////////////////////////////////////////////////////////
// Marquee.cs
// 走马灯
//
// @remarks For study purpose
//
// @author Icebird @date 2006-06-22
/**////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace ControlsEx

{
/**//// <summary>
/// 走马灯
/// </summary>
public class Marquee : System.Windows.Forms.Control
{
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

/**//// <summary>
/// Constructor
/// </summary>
public Marquee()
{
InitializeComponent();
}

/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
{
components.Dispose();
timer.Stop();
timer.Dispose();
lbl.Dispose();
}
}
base.Dispose( disposing );
}
private Timer timer;
private Label lbl;

组件设计器生成的代码#region 组件设计器生成的代码
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
lbl = new Label();
lbl.Parent = this;
lbl.AutoSize = true;
lbl.Visible = false;
timer = new Timer(components);
timer.Tick +=new EventHandler(timer_Tick);
Speed = 1;
timer.Start();
}
#endregion

/**//// <summary>
/// 字体
/// </summary>
public override Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
lbl.Font = value;
}
}

/**//// <summary>
/// 显示文字,用'|'分隔信息
/// </summary>
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
infos = value.Split(new char[]
{'|'});
if (infos.Length > 0)
{
index = 0;
lbl.Text = infos[0];
}
else
lbl.Text = value;
offset = -2;
lbl.Top = (ClientSize.Height - lbl.Height) / 2;
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize (e);
lbl.Top = (ClientSize.Height - lbl.Height) / 2;
}
protected override void OnEnabledChanged(EventArgs e)
{
base.OnEnabledChanged (e);
lbl.Visible = Enabled;
if (Enabled)
timer.Start();
else
timer.Stop();
}
private int offset;
private int index;
private void timer_Tick(object sender, EventArgs e)
{
if (!Enabled)
return;
offset++;
int newLeft = Width - offset;
lbl.Left = newLeft;
if (lbl.Text.Length > 0)
lbl.Visible = true;
lbl.Invalidate();
if (newLeft + lbl.Width < 0)
{
//显示下一条
offset = -2;
index++;
if (index >= infos.Length)
index = 0;
if (Width > 4)
lbl.Left = Width;
lbl.Text = infos[index];
}
}
private string[] infos;

/**//// <summary>
/// 滚动速度,范围1~10,1最快,10最慢
/// </summary>
public int Speed
{
get
{
return timer.Interval / 20;
}
set
{
if (value < 1 || value > 10)
return;
timer.Stop();
timer.Interval = value * 20;
timer.Start();
}
}
}
}
