C # TextBox Межстрочный интервал - PullRequest
2 голосов
/ 29 ноября 2010

Я работаю над плагином для Paint.net, который преобразует текущее изображение в искусство ASCII.У меня нормально работает преобразование, и оно выводит искусство ASCII в элемент управления TextBox с шрифтом фиксированной ширины.Моя проблема в том, что искусство ASCII растягивается по вертикали из-за межстрочного интервала в TextBox.Есть ли способ установить межстрочный интервал для TextBox?

1 Ответ

3 голосов
/ 29 ноября 2010

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

Моим первым предложением было бы использовать RichTextBox, но, опять же, RTF не имеет кода для межстрочного интервала, поэтому я считаю, что это также невозможно.

Так что мои последние предложениядолжен использовать нарисованный владельцем контроль.Это не должно быть слишком сложно с шрифтом фиксированной ширины - вы знаете, местоположение каждого символа (x*w, y*h), где x и y - индекс символа, а w и h - размер одногосимвол.

Редактировать: Думая об этом немного больше, это еще проще - просто разделить строку на линии и нарисовать каждую линию.


Вот простойконтроль, который делает именно это.При тестировании я обнаружил, что для Font = new Font(FontFamily.GenericMonospace, 10, FontStyle.Regular) лучшее значение для Spacing было -9.

/// <summary>
/// Displays text allowing you to control the line spacing
/// </summary>
public class SpacedLabel : Control {
    private string[] parts;

    protected override void OnPaint(PaintEventArgs e) {
        Graphics g = e.Graphics;
        g.Clear(BackColor);

        float lineHeight = g.MeasureString("X", Font).Height;

        lineHeight += Spacing;

        using (Brush brush = new SolidBrush(ForeColor)) {
            for (int i = 0; i < parts.Length; i++) {
                g.DrawString(parts[i], Font, brush, 0, i * lineHeight);
            }
        }
    }

    public override string Text {
        get {
            return base.Text;
        }
        set {
            base.Text = value;
            parts = (value ?? "").Replace("\r", "").Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
        }
    }

    /// <summary>
    /// Controls the change in spacing between lines.
    /// </summary>
    public float Spacing { get; set; }
}
...