2012-01-06 21 views
3

TextBoxコントロールの各文字の間隔(幅)を動的に設定しようとしています。私は何度も読んだことがあり、これは通常のTextBoxでも可能だとは思わない。私はRichTextBoxまたはこれを解決する他のコントロールに開いています。TextBoxコントロールの文字間隔/幅の変更

これが可能であることを証明するために、私はWordを開いて、1文字を選択してスペースを調整して「ストレッチ」することができました。私は私の.NETアプリケーションで同じ動作を達成するために探しています。

Modified M

コードサンプルまたはコントロールがこれを達成する方法を示しているそこにありますか?

+1

私は実際に、これを行うための他の方法は考えられません。 1つはTextBoxクラスを継承しますが、1つは文字のペイントを制御します。各文字の位置をすでに知っているので、これらのものがどのようにボックスに表示されるかを指定することができます(たとえば、フォントで固定した場合)。 DevExpress、DevComponents、Telerakなどのサードパーティのコントロールを使用することもできます。 –

+1

独自のコントロールを実装し、Graphics.ScaleTransform()+ Graphics.DrawString()を使用する必要があります。文字間隔を正しく取得するのは難しい、Graphics.MeasureCharacterRanges。見栄えを良くすることさえ難しくなります。 –

+0

あなた自身のコントロールを作るという安価なハックは、WebBrowserコントロールを使うことかもしれません。あなたが望むことをするためには、HTMLを生成するだけです。テストされていませんが、うまくいくと思います。もちろん、コントロールに入力することはできません。少なくとも、TextBoxの場合と同じようにWebBrowserを拡張することなく、作業領域と表示領域を分割する必要があります。 –

答えて

0

参考のために、このコードを書いたので、RichTextBoxに入力する各文字のフォント、フォントスタイルを変更できます。

public int a = 0; 
private void richTextBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (a == 0) 
     { 
      richTextBox1.SelectionFont = new Font(RichTextBox.DefaultFont, FontStyle.Bold); 
      a = 1; 
     } 
     else if (a == 1) 
     { 
      richTextBox1.SelectionFont = new Font("Georgia",13, FontStyle.Bold); 
      a = 2; 
     } 
     else if (a == 2) 
     { 
      richTextBox1.SelectionFont = new Font("Impact", 11, FontStyle.Italic); 
      a = 0; 
     } 
    } 

これが役立つ場合はお知らせください。

4

いくつかのWPFのアセンブリ(WindowsBaseおよびPresentationCore)へのリンクを受け入れる場合は、カスタムTextBoxを作成してWinForms実装で使用できます。 WPFには、GlyphTypeFace(フォントファイルをロードしてグリフからジオメトリを作成することができます)、GlyphRun(グリフのリスト - テキスト)を描画できるような素敵なクラスがあります。しかし、ここではGlyphRunを使用することはできません。なぜなら、いくつかのグリフのジオメトリを変更できるようにするためです。したがって、ジオメトリを手動で取得して変換する必要があります。ここで

は一例です:

のWinformsコード:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     // ElementHost allows Winforms to host WPF visual components 
     ElementHost host = new ElementHost(); 
     host.Dock = DockStyle.Fill; 
     host.Child = new MyTextBox(); 
     Controls.Add(host); 
    } 

カスタムテキストボックスコード:

public class MyTextBox: UIElement 
{ 
    protected override void OnRender(DrawingContext drawingContext) 
    { 
     const string sampleText = "Sample String"; 
     const int sampleEmSize = 30; 

     GlyphTypeface typeFace = new GlyphTypeface(new Uri("file:///C:/WINDOWS/FONTS/segoeui.ttf")); 

     GeometryGroup group = new GeometryGroup(); 
     group.FillRule = FillRule.Nonzero; 

     double x = 0; 
     double y = sampleEmSize; 
     for (int i = 0; i < sampleText.Length; i++) 
     { 
      ushort glyphIndex = typeFace.CharacterToGlyphMap[sampleText[i]]; 
      Geometry glyphGeometry = typeFace.GetGlyphOutline(glyphIndex, sampleEmSize, sampleEmSize).Clone(); 
      TransformGroup glyphTransform = new TransformGroup(); 

      if (sampleText[i] == 'm') // this is a sample, we just change the 'm' characte 
      { 
       const double factor = 2; 
       glyphTransform.Children.Add(new ScaleTransform(factor, 1)); 
       glyphTransform.Children.Add(new TranslateTransform(x, y)); 
       x += factor * typeFace.AdvanceWidths[glyphIndex] * sampleEmSize; 
      } 
      else 
      { 
       glyphTransform.Children.Add(new TranslateTransform(x, y)); 
       x += typeFace.AdvanceWidths[glyphIndex] * sampleEmSize; 
      } 

      glyphGeometry.Transform = glyphTransform; 
      group.Children.Add(glyphGeometry); 
     } 

     drawingContext.DrawGeometry(Brushes.Black, null, group); 
    } 
} 

そして、ここでのWinFormsの結果である:

enter image description here

もちろん、編集をサポートしたい場合はいくつかの作業がありますが、これが始まる可能性があります。

+0

多分この質問/回答はあなたを助けることができます:http:// stackoverflow。com/questions/5025740/c-check-for-unsupported-characters-glyphs-in-a-font – juFo

0

WinFormsのTelerikコントロールを調べることができます。私は彼らがスタイル要素に大きな重点を置いていることを知っています。