代码之家  ›  专栏  ›  技术社区  ›  Entity

C#文本框行距

  •  2
  • Entity  · 技术社区  · 14 年前

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

    1 回复  |  直到 14 年前
        1
  •  3
  •   configurator    14 年前

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

    我的第一个建议是使用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; }
    }