我正在开发Paint.net
的插件,可将当前图像转换为ASCII艺术。我的转换工作正常,它将ASCII艺术输出到TextBox
控件,具有固定宽度的字体。我的问题是,由于TextBox中的行间距,ASCII艺术被垂直拉伸。有没有办法设置TextBox
的行间距?
答案 0 :(得分:3)
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; }
}