私はループのない優れたソリューションを見つけました。この方法では、現在の幅と目標の幅の比を計算します。この比に現在の文字列の長さを乗算すると、良い部分文字列の点が得られます。
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);
}
}
これはどのアプリケーションですか?適切なタグ付けを使用する –
これはWindowsフォームアプリケーション –
固定幅フォントを使用しない限り、すべての文字の幅が異なるため、このようなことが必要です。 – TaW