Метод DrawString повторяет строку дважды - PullRequest
0 голосов
/ 05 января 2020

Я хочу, чтобы он взял данный фрагмент текста и правильно отобразил его в виде абзаца (при необходимости переходя на новую строку), используя DrawString и for (;;) l oop, но в результате получаются помехи.

private void pnlText_Paint(object sender, PaintEventArgs e)
    {
        pnlText.Font = new Font("Calibri", 14, FontStyle.Regular);
        SizeF lineSize = new SizeF();

        for (int i = 0; i < DisplayText.Length; i++)
        {
            currentLine += DisplayText[i];

            lineSize = e.Graphics.MeasureString(currentLine, pnlText.Font);
            if (DisplayText[i].ToString() == " " && lineSize.Width >= 820)
            {

                paragraph += currentLine + "\n";
                currentLine = null;

            }
        }
        using (SolidBrush br = new SolidBrush(Color.Black))
        {
            e.Graphics.DrawString(paragraph, pnlText.Font, br, 5, 5);
        }
    }

Вывод: одно предложение весь абзац

Я ошеломлен, повторять подобное бессмысленно. Я попытался использовать String Builder и заменить DisplayText.Length на число, и оно все еще не работает правильно. Использование foreach и отрисовка каждого символа по отдельности работает, хотя и портит интервалы.

Также изначально у меня не было строки "абзаца", и я просто рисовал каждую строку внутри l oop, но это как-то вызвало конец текста, который будет вырезан и вставлен в самом начале, что еще более безумно. Я подозреваю, что мой компьютер одержим демонами.

Ответы [ 2 ]

1 голос
/ 05 января 2020
private void pnlText_Paint(object sender, PaintEventArgs e)
    {
        pnlText.Font = new Font("Calibri", 14, FontStyle.Regular);
        SizeF lineSize = new SizeF();
        currentLine = null;
        paragraph = null;
        for (int i = 0; i < DisplayText.Length; i++)
        {
            currentLine += DisplayText[i];

            lineSize = e.Graphics.MeasureString(currentLine, pnlText.Font);
            if (DisplayText[i].ToString() == " " && lineSize.Width >= 820)
            {

                paragraph += currentLine + "\n";
                currentLine = null;

            }
        }
        paragraph += currentLine;
        using (SolidBrush br = new SolidBrush(Color.Black))
        {
            e.Graphics.DrawString(paragraph, pnlText.Font, br, 5, 5);
        }
    }

Следовал совету Ханса Ке и теперь он работает. Что-то вызывает событие рисования более одного раза, поэтому строки не являются нулевыми для начала.

1 голос
/ 05 января 2020

Кажется, что ваша переменная paragraph имеет общее состояние. Убедитесь, что вы сбрасываете состояние для каждого нажатия кнопки следующим образом:

private void pnlText_Paint(object sender, PaintEventArgs e)
    {
        pnlText.Font = new Font("Calibri", 14, FontStyle.Regular);
        SizeF lineSize = new SizeF();

        paragraph = ""; // that should reset the paragraph variable between invocations

        for (int i = 0; i < DisplayText.Length; i++)
        {
            currentLine += DisplayText[i];

            lineSize = e.Graphics.MeasureString(currentLine, pnlText.Font);
            if (DisplayText[i].ToString() == " " && lineSize.Width >= 820)
            {

                paragraph += currentLine + "\n";
                currentLine = null;

            }
        }
        using (SolidBrush br = new SolidBrush(Color.Black))
        {
            e.Graphics.DrawString(paragraph, pnlText.Font, br, 5, 5);
        }
    }

Или просто определите его в методе pnlText_Paint

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...