2010-11-29 74 views
2

私はASCIIアートに現在の画像を変換しPaint.netためのプラグインに取り組んでいます。私は変換が正常に動作しており、ASCIIアートを固定幅フォントのTextBoxコントロールに出力します。私の問題は、TextBoxの行間隔のためにASCIIアートが縦に伸びていることです。 TextBoxの行間隔を設定する方法はありますか?C#のTextBox行間隔

+1

おそらく、リッチテキストボックスを使用して、行の高さ設定:http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/8781caf6-5759-4fee-8c08-cd8a2d85fc9fを? –

答えて

3

TextBoxは書式設定オプションのない単一行または複数行のテキストを表示するだけです。フォントは使用できますが、テキストボックスではなくTextBoxに適用されるため、行間隔などの段落設定はわかっています。

私の最初の提案は、リッチテキストボックスを使用することですが、その後、再び、RTFはので、私はそれは同様に不可能であろうと信じて行間隔のためのコードを持っていません。

だから私の最後の提案はオーナー描画コントロールを使用することです。これは、固定幅フォントで、あまりにも難しいことではありません - あなたは、各文字の位置がxyは文字インデックスとwhある(x*w, y*h)は、1つの文字の大きさであることを知っています。

編集:もう少し考えれば、文字列を線で区切り、各行を描画するだけで簡単です。


これだけの簡単なコントロールがあります。テストしたところ、Font = new Font(FontFamily.GenericMonospace, 10, FontStyle.Regular)の場合、Spacingの値はでした。

/// <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; } 
}