我有一个自定义的圆角文本框,我不想将文本写入圆角部分,所以我想知道从字符串开头到达指定的字符数。我知道TextRenderer.MeasureText
来测量一个字符串,但它只给出一个字符串的宽度,不能反向运行。我怎么能这样做?
我可以这样做,但有时可能需要很长时间。
string resultText = string.Empty;
for (int i = 0; i < Text.Length; i++)
{
resultString = Text.Substring(0, i);
if (TextRenderer.MeasureText(resultText, Font).Width <= textWidth)
break;
}
答案 0 :(得分:0)
我找到了一个没有循环的更好的解决方案。在这种方法中,我们计算当前宽度和目标宽度之间的比率。如果这个比率乘以当前的字符串长度,我们就会得到一个好的子字符串点。
string GetSubStringToWidth(string orgText, int width, Font font)
{
int orgWidth = TextRenderer.MeasureText(orgText, font).Width;
float ratio = (float)width / orgWidth;
int length = (int)(orgText.Length * ratio);
if (length >= orgText.Length) return orgText;
else if (length <= 0) return "";
else
{
//May be more sensitive if we go right or left one unit because of letter unequalities
int mid = Math.Abs(width - TextRenderer.MeasureText(orgText.Substring(0, length), font).Width);
int right = Math.Abs(width - TextRenderer.MeasureText(orgText.Substring(0, length + 1), font).Width);
int left = Math.Abs(width - TextRenderer.MeasureText(orgText.Substring(0, length - 1), font).Width);
int i = Math.Min(Math.Min(mid, right), left);
int point = 0;
if (i == mid)
point = length;
else if (i == right)
point = length + 1;
else
point = length - 1;
return orgText.Substring(0, point);
}
}