近日在撰寫程式時,有需要用到跑馬燈程式,在此做個紀錄。
這邊提供幾種跑馬燈的實作方式
一、Substring()
1.
用一個參數放跑馬燈的字
- string Marqueest="這是跑馬燈測試,颱風瑪麗亞進來了,大家一起喊阿嗎瑪麗亞~"
2.
拉一個timer元件 與 可放文字的物件(ex:TextBox or Label)
- timer的Enable設為true,讓他開始work
- Interval 預設為 100 ,數字改愈大就會跑的愈慢(100=0.1秒)
3.
設定timer的timer_Tick事件
private
void timer1_Tick(object sender, EventArgs e)
{
string newst =Marqueest.Substring(0, 1); //第一個字
Marqueest= Marqueest.Substring(1, Marqueest.Length - 1)
+ newst ;
//新字串每次從第二個字開始抓,然後把之前抓的第一個字補在最後
label1.Text = Marqueest; //顯示字串
}
二、讓整個元件移動
1.
拉一個timer元件 與 可放文字的物件(ex:TextBox
or Label)
2.
物件的Text中放入跑馬燈文字
- timer的Enable設為true,讓他開始work
- Interval 預設為 100 ,數字改愈大就會跑的愈慢(100=0.1秒)
3.
設定timer的timer_Tick事件
PS:【label2.Left = label2.Left - 3;】減去的數字越大,跑的速度越快,減太多,會變成用跳的
private void timer2_Tick(object sender, EventArgs e)
{
if (label2.Left + label2.Width > 0)
label2.Left
= label2.Left - 3;
else if
(label2.Left < 1)
label2.Left
= 390;
}
三、用畫的直接指定物件的Location,這方法會不斷更新元件位置,MSDN上的解釋來看這方法可能會浪費效能,還是提供給大家參考
大致方法是
物件名稱.Location = new Point(x,y);
一樣丟在timer的Tick事件內就可以了
補充:
1.新增一個類別 ,具體程式碼如下
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace POSmedia.Obiect
{
class Marquee : PictureBox
{
int X = 0;
int Y = 0;
String DrawText = String.Empty;
Bitmap OrgBmp = null;
delegate void SetImage(Image NewImage);
public void Start(Form Parent, String Text, Point Location, Size RectSize)
{
//MessageBox.Show(Parent + " " + Text + " " + Location + " " + RectSize);
this.Parent = Parent;
this.DrawText = Text;
this.Location = Location;
this.Size = RectSize;
X = RectSize.Width ;
Y = RectSize.Height;
this.Visible = true;
this.Image = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
Graphics G = Graphics.FromImage(this.Image);
G.FillRectangle(new SolidBrush(Color.FromArgb(255, 89, 89, 89)), this.ClientRectangle);
G.Dispose();
OrgBmp = new Bitmap(this.Image);
Thread T = new Thread(new ThreadStart(DoDraw));
T.Start();
}
public void Stop()
{
this.Visible = false;
}
void DoDraw()
{
while (this.Visible)
{
Bitmap CacheBmp = new Bitmap(OrgBmp);
Graphics G = Graphics.FromImage(CacheBmp);
//G.DrawString(DrawText, new Font("微軟正黑體", 22), new SolidBrush(Color.Black), new PointF(0, Y = Y-- < 0 ? this.Size.Height : Y)); //上下
G.DrawString(DrawText, new Font("微軟正黑體",22 ), new SolidBrush(Color.FromArgb(255, 250, 250, 250)), new PointF(X = X-- < -1024 ? this.Size.Width : X, 0)); //左右
G.Dispose();
this.Invoke(new SetImage(DoSetImage), new Object[] { CacheBmp });
Thread.Sleep(Sell.rumtime);
}
}
void DoSetImage(Image NewImage)
{
this.Image = NewImage;
}
}
}
2.新增一個方法
Marquee M = null;
void runbox() //畫跑馬燈
{
M = new Marquee();
M.Start(this, Sell.runst, Point.Add(label1.Location, new Size(0, 0)), new Size(label1.Width, label1.Height));
}
private void timer1_Tick(object sender, EventArgs e) //使用這個是為了避開調整全螢幕時的BUG
{
runbox();
timer1.Enabled = false;
}
這樣就會實現動態的方式了,跑馬燈的快慢通過Sell.rumtime去控制
0 意見:
張貼留言