Как я могу предотвратить переход ярлыков друг на друга в цикле for? - PullRequest
1 голос
/ 08 июля 2019

Хорошо, я забираю текст из текстового поля внутри формы. Из каждой буквы в этом тексте я хочу создать ярлык с собственным размером шрифта и цветом. Проблема в том, что когда я делаю цикл for для каждой буквы в тексте, который создает метки, метки в конечном итоге накапливаются друг с другом. И это приводит только к одному письму.

Как автоматически расположить метки рядом друг с другом, чтобы они снова напоминали обычный текст и не допустить его накопления?

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

class MyGroup: Control
    {
        string s;
        private Random rnd = new Random();

    public MyGroup()
    {
        this.AutoSize = true;
        this.Location = new System.Drawing.Point(10, 10);
        this.Name = "groupBox1";
        this.Size = new System.Drawing.Size(126, 21);
        this.TabIndex = 5;
        this.TabStop = false;
        //this.Text = "groupBox1";
    }

    public void SetString(string s)
    {
        this.s = s;
    }

    public void Fall()
    {
        for (int i = 0; i < s.Length; i++)
        {

            Label l = new Label
            {
                Location = new System.Drawing.Point(this.Location.X, this.Location.Y),
                ForeColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)),
                Font = new Font("Arial", rnd.Next(7, 15), FontStyle.Bold)
            };
            l.Text += this.s[i];
            this.Parent.Controls.Add(l);
        }

        this.Visible = false;

    }
}

в Form.cs:

private void button1_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(EnteredText.Text) && EnteredText.Text.Length > 1)
            {
                EnteredText.Text.ToCharArray();
                groupBox1.SetString(EnteredText.Text);
                groupBox1.Fall();


            }
        else
        {
            MessageBox.Show("Please enter a text with more than 2 letters.");
        }
    }

1 Ответ

0 голосов
/ 08 июля 2019

Заменить тело "Fall" следующим:

int nextX =  this.Location.X;
for (int i = 0; i < s.Length; i++)
{
    Label l = new Label
    {
        Location = new System.Drawing.Point(nextX, this.Location.Y),
        ForeColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256)),
        Font = new Font("Arial", rnd.Next(7, 15), FontStyle.Bold),
    };
    l.Text += this.s[i];
    l.Width = TextRenderer.MeasureText(l.Text, l.Font).Width;
    this.Parent.Controls.Add(l);
    nextX += l.Width;
}

this.Visible = false;

Это будет выглядеть так:
example

...