我試圖動態設置TextBox控件中每個字符的間距(寬度)。我已經完成了大量的閱讀,我不相信在一個普通的TextBox中這是可能的。我向RichTextBox或任何其他可以解決此問題的控件開放。在TextBox控件中修改字符間距/寬度
爲了證明這是可能的,我打開了Word,我可以選擇一個字符並調整其間距並「伸展」出來。我正在尋找在我的.NET應用程序中實現相同的行爲。
是否有一個代碼示例或控制了那裏,顯示瞭如何能實現呢?
我試圖動態設置TextBox控件中每個字符的間距(寬度)。我已經完成了大量的閱讀,我不相信在一個普通的TextBox中這是可能的。我向RichTextBox或任何其他可以解決此問題的控件開放。在TextBox控件中修改字符間距/寬度
爲了證明這是可能的,我打開了Word,我可以選擇一個字符並調整其間距並「伸展」出來。我正在尋找在我的.NET應用程序中實現相同的行爲。
是否有一個代碼示例或控制了那裏,顯示瞭如何能實現呢?
供您參考,我已經編寫了這段代碼,它可以讓您更改字體,每種字符的字體樣式都會輸入到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;
}
}
讓我知道這是否對您有幫助。
如果接受鏈接到一些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結果:
當然,如果你想支持編輯,還有一些工作要做,但這可能會讓你開始。
也許這個問題/答案可以幫助你:http:// stackoverflow。COM /問題/ 5025740/C檢換不支持的字符,字形-IN-A-字體 – juFo 2013-06-04 10:28:07
你可以看看WinForms的Telerik控件。我知道他們非常重視風格元素。
我不能真正想到任何其他方法來做到這一點,除了業主繪製控制;一個繼承了TextBox類,但後來你控制了字符的顏色;因爲您已經知道每個字符的位置,所以您可以指定(如果您使用的字體是固定的,例如)這些東西如何顯示在框中。或者您可以使用DevExpress,DevComponents或Telerak等第三方控件。 – 2012-01-07 07:33:04
您必須實現自己的控件並使用Graphics.ScaleTransform()+ Graphics.DrawString()。很難得到正確的字母間距,Graphics.MeasureCharacterRanges。更難以讓它看起來不錯。 – 2012-01-09 18:26:49
各地製作自己控制一個廉價的黑客可能是使用WebBrowser控件 - 這樣你就只需要生成HTML做你想做什麼。沒有測試,但我認爲它可以工作。當然,你不能輸入控件,你必須在工作區域和顯示區域之間進行分割...至少不需要像TextBox那樣擴展WebBrowser。 – 2012-01-13 18:43:17