2012-01-06 101 views
3

我試圖動態設置TextBox控件中每個字符的間距(寬度)。我已經完成了大量的閱讀,我不相信在一個普通的TextBox中這是可能的。我向RichTextBox或任何其他可以解決此問題的控件開放。在TextBox控件中修改字符間距/寬度

爲了證明這是可能的,我打開了Word,我可以選擇一個字符並調整其間距並「伸展」出來。我正在尋找在我的.NET應用程序中實現相同的行爲。

Modified M

是否有一個代碼示例或控制了那裏,顯示瞭如何能實現呢?

+1

我不能真正想到任何其他方法來做到這一點,除了業主繪製控制;一個繼承了TextBox類,但後來你控制了字符的顏色;因爲您已經知道每個字符的位置,所以您可以指定(如果您使用的字體是固定的,例如)這些東西如何顯示在框中。或者您可以使用DevExpress,DevComponents或Telerak等第三方控件。 – 2012-01-07 07:33:04

+1

您必須實現自己的控件並使用Graphics.ScaleTransform()+ Graphics.DrawString()。很難得到正確的字母間距,Graphics.MeasureCharacterRanges。更難以讓它看起來不錯。 – 2012-01-09 18:26:49

+0

各地製作自己控制一個廉價的黑客可能是使用WebBrowser控件 - 這樣你就只需要生成HTML做你想做什麼。沒有測試,但我認爲它可以工作。當然,你不能輸入控件,你必須在工作區域和顯示區域之間進行分割...至少不需要像TextBox那樣擴展WebBrowser。 – 2012-01-13 18:43:17

回答

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),你可以寫一個自定義的文本框,並在一個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 /問題/ 5025740/C檢換不支持的字符,字形-IN-A-字體 – juFo 2013-06-04 10:28:07

0

你可以看看WinForms的Telerik控件。我知道他們非常重視風格元素。