利用 Timer 定期修改 Label.Left / Top 座標,配合邊界檢查實現循環滾動。關鍵在於「步長」與「間隔」的平衡:步長太大會閃爍,間隔太長會卡頓。
public partial class MarqueeForm : Form
{
public MarqueeForm()
{
InitializeComponent();
timer.Interval = 80; // 約 12.5 FPS
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
// 向右移動
lblMarquee.Left += 4;
// 完全移出視窗右側 → 瞬間移到左側外繼續
if (lblMarquee.Left > this.ClientSize.Width)
lblMarquee.Left = -lblMarquee.Width;
}
}
| 方向 | 修改屬性 | 邊界判斷 | 重置位置 |
|---|---|---|---|
| 左→右 | Left += step | Left > ClientWidth | Left = -LabelWidth |
| 右→左 | Left -= step | Left < -LabelWidth | Left = ClientWidth |
| 下→上 | Top -= step | Top < -LabelHeight | Top = ClientHeight |
| 上→下 | Top += step | Top > ClientHeight | Top = -LabelHeight |
Panel,僅移動 Panel 內容,避免邊界計算受表單邊框影響。Paint 事件中 DrawString,支援漸變、描邊、圖文混排,效能更佳。ScrollViewer + TranslateTransform + DoubleAnimation 實現硬體加速跑馬燈。AutoSize = true 會導致寬度隨文字改變,滾動時寬度變動造成抖動 → 設 AutoSize = false 固定寬高。Enabled = false,記得程式碼啟動或屬性視窗勾選。