如何使标签来回滚动一个单词

本文关键字:一个 单词 滚动 何使 标签 | 更新日期: 2023-09-27 18:24:26

我想出了一个主意,让标签将一个单词滚动到一边,然后更改单词并滚动回另一边,就像一样

   "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。

如何使标签来回滚动一个单词

下面是我要做的,当我测试它时,它似乎工作得很好,我创建了一个带有计时器和标签的windows窗体。确保调用计时器。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);
        }
   }

我会保持标签内容不变,只需移动标签,感觉CPU负载应该更少,滚动也会更流畅。

创建一个从0到11的for循环(长度为"ping"的15)。使用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();
        }
    }
}

请注意,此解决方案并不完美,因为表单无法正确关闭。您将不得不中止该程序。使用计时器的解决方案会更顺利地工作,表单在关闭时也会像预期的那样运行,但这是一个简单明了的解决方案。

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

StringBuilder的想法很棒,因为它应该比处理String更高效。我喜欢Asynchronous delegate,因为它听起来比Timer 更令人印象深刻