Как сделать так, чтобы метка прокручивала слово взад-вперед? - PullRequest
3 голосов
/ 12 февраля 2012

Мне пришла в голову идея сделать так, чтобы метка прокручивала слово в одну сторону, а затем меняла слово и возвращалась к другой, например, так:постоянный цикл, но я не знаю, с чего бы я вообще начал это делать, я ДЕЙСТВИТЕЛЬНО оценил бы это, если бы кто-то мог помочь мне с этим.Максимальная длина текста должна быть 15 символов.

Мне все равно, плавная ли это прокрутка.

Я хочу, чтобы это было приложение Winforms и использование .Net framework 4.0.

Ответы [ 4 ]

1 голос
/ 12 февраля 2012

Я бы оставил содержимое метки одинаковым и просто переместил бы метку, кажется, что загрузка процессора должна быть меньше, а прокрутка будет более плавной.

1 голос
/ 12 февраля 2012

Вот что я хотел бы сделать, мне показалось, что он отлично работает, когда я его протестировал, я создал форму окна с таймером и надписью на нем. Обязательно вызовите 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);
        }

   }
0 голосов
/ 12 февраля 2012

Я нашел этот пример .Довольно близко к тому, что вы хотите.Два ключевых элемента: (1) использование функций StringBuilder для добавления символов и (2) асинхронный делегат для помещения анимации в другой поток.

Идея StringBuilder великолепна, поскольку она должна быть болееэффективен при работе с String.И мне нравится Asynchronous delegate, потому что это звучит гораздо более впечатляюще, чем Timer

0 голосов
/ 12 февраля 2012

Создайте цикл for, который работает от 0 до 11 (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();
        }
    }
}

Обратите внимание, что это решение не идеально, так как форма не будет закрыта должным образом.Вам придется прервать программу.Решение, использующее таймер, будет работать более плавно, и при закрытии форма будет работать так, как ожидалось, однако это простое и простое решение.

...