C#TextBox行间距

时间:2010-11-29 00:12:58

标签: c# formatting textbox

我正在开发Paint.net的插件,可将当前图像转换为ASCII艺术。我的转换工作正常,它将ASCII艺术输出到TextBox控件,具有固定宽度的字体。我的问题是,由于TextBox中的行间距,ASCII艺术被垂直拉伸。有没有办法设置TextBox的行间距?

1 个答案:

答案 0 :(得分:3)

TextBox只显示没有格式化选项的单行或多行文本 - 它可以有一个字体但适用于TextBox而不适用于文本,所以就我所知,你不能有像行间距这样的段落设置。

我的第一个建议是使用RichTextBox,但是再一次,RTF没有行间距的代码,所以我认为这也是不可能的。

所以我的最终建议是使用所有者绘制的控件。使用固定宽度字体应该不会太难 - 您知道每个字符的位置为(x*w, y*h),其中xy是字符索引和wh是一个字符的大小。

编辑:更多地思考它,它甚至更简单 - 只需将字符串分隔成行并绘制每一行。


这是一个简单的控件。在测试时,我发现对于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; }
}