如何使标签来回滚动?

时间:2012-02-11 22:59:28

标签: c# winforms scroll marquee

我想出了一个标签将一个单词滚动到一边,然后更改单词并滚动回另一个单词的想法

   "ping           "
   " ping          "
   "  ping         "
   "   ping        "
   "    ping       "
   "     ping      "
   "      ping     "
   "       ping    "
   "        ping   "
   "         ping  "
   "          ping "
   "           ping"
   "           pong"
   "          pong "
   "         pong  "
   "        pong   "
   "       pong    "
   "      pong     "
   "     pong      "
   "    pong       "
   "   pong        "
   "  pong         "
   " pong          "
   "pong           "

我希望它只在一个恒定的循环中做^^但我不知道如何开始这样做我真的很感激它,如果有人可以帮我这个。文本的最大长度必须为15个字符。

我不在乎它是否是平滑滚动。

我希望它成为Winforms应用程序并使用.Net framework 4.0。

4 个答案:

答案 0 :(得分:1)

这就是我要做的事情,当我测试它时似乎工作得很好,我创建了一个带有计时器和标签的窗体。确保在打开表单时调用timer.Start(),它将开始在屏幕上弹跳。如果将iUBound更改为更大的值,它将在屏幕上移动更多空格。

    string _sPing = "ping";
    string _sPong = "pong";
    bool bGoingUp = true;
    int iUBound = 15;
    int iCnt = 1;

    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (bGoingUp)
        {
            label1.Text = " " + label1.Text;
            iCnt++;
        }
        else
        {
            label1.Text = label1.Text.Substring(1,label1.Text.Length - 1);
            iCnt--;
        }

        if (iCnt == iUBound)
        {
            bGoingUp = false;
            label1.Text = label1.Text.Replace(_sPing, _sPong);
        }
        else if (iCnt == 1)
        {
            bGoingUp = true;
            label1.Text = label1.Text.Replace(_sPong, _sPing);
        }

   }

答案 1 :(得分:1)

我保持标签内容相同,只需移动标签,感觉它应该减少CPU负载,滚动会更顺畅。

答案 2 :(得分:0)

创建一个从0到11的for循环(15 - " ping"的长度)。使用new String(' ', i),您可以创建长i个字符的字符串。然后将标签的文本设置为此空格字符串,连接单词" ping"。

现在你可以创建另一个循环,从11运行到0,执行相同的操作但是使用" pong"。

如果将两个循环包含在无限循环(while (true) { ... })中,这将无限期地运行。

您还可能希望每次使用Thread.Sleep(200)设置标签文本后添加暂停。您指定的时间以毫秒为单位。


编辑(因为它不是家庭作业):

转到属性窗口中的“事件”选项卡,然后添加Shown事件处理程序

private void frmMarquee_Shown(object sender, EventArgs e)
{
    while (true) {
        for (int i = 0; i <= 11; i++) {
            label1.Text = new String(' ', i) + "ping";
            System.Threading.Thread.Sleep(100);
            Application.DoEvents();
        }
        for (int i = 11; i >= 0; i--) {
            label1.Text = new String(' ', i) + "pong";
            System.Threading.Thread.Sleep(100);
            Application.DoEvents();
        }
    }
}

请注意,此解决方案并不完美,因为表单无法正常关闭。你将不得不中止该计划。使用计时器的解决方案将更顺畅,表单在关闭时将按预期运行,但这是一个简单明了的解决方案。

答案 3 :(得分:0)

我找到了this example。非常接近你想要的。这两个关键元素是:(1)使用StringBuilder函数追加字符;(2)使用异步委托将动画放在不同的线程中。

StringBuilder的想法很棒,因为处理String应该更有效率。我喜欢Asynchronous delegate,因为它听起来比Timer

更令人印象深刻