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