如何根据宽度值获取字符串部分?

时间:2016-03-28 06:30:08

标签: c# string winforms textbox custom-controls

我有一个自定义的圆角文本框,我不想将文本写入圆角部分,所以我想知道从字符串开头到达指定的字符数。我知道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;
    }

1 个答案:

答案 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);
        }
    }