C#文本框行间距

C#文本框行间距,c#,formatting,textbox,C#,Formatting,Textbox,我正在开发一个插件,用于将当前图像转换为ASCII艺术。我的转换工作正常,它将ASCII艺术输出到一个TextBox控件中,使用固定宽度的字体。我的问题是,由于文本框中的行距,ASCII艺术被垂直拉伸。有没有办法设置文本框的行距?文本框只显示单行或多行文本,没有格式选项-它可以有一种字体,但适用于文本框,而不适用于文本,所以据我所知,你不能有像行距这样的段落设置 我的第一个建议是使用RichTextBox,但RTF没有行距代码,所以我认为这也是不可能的 所以我最后的建议是使用所有者绘制的控件。使

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

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

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

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

编辑:再考虑一下,就更简单了——只需将字符串分隔成几行,然后画每一行


这里有一个简单的控件,它就是这样做的。在测试它时,我发现对于
Font=new Font(FontFamily.GenericMonospace,10,FontStyle.Regular)
,间距
的最佳值是
-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; }
}
//
///显示允许您控制行距的文本
/// 
公共类SpacedLabel:控件{
私有字符串[]部分;
受保护的覆盖无效OnPaint(PaintEventArgs e){
图形g=e.图形;
g、 清晰(背景色);
浮动线高度=g.MeasureString(“X”,字体)。高度;
线宽+=间距;
使用(笔刷=新的SolidBrush(前景色)){
对于(int i=0;i
也许可以使用RichTextBox并设置行高:?