2016-03-28 16 views
3

私はカスタムの丸められたテキストボックスを持っていて、丸い部分にテキストを書きたくないので、指定した文字列の先頭からどれくらいの文字が来るかを知りたいと思います。私は文字列を測定するために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

これはWindowsフォームアプリケーション –

+0

固定幅フォントを使用しない限り、すべての文字の幅が異なるため、このようなことが必要です。 – TaW

答えて

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); 
     } 
    } 
+0

これはあらゆる種類のコンテンツでうまくいくのではないかと疑います。また、タイミングに関するあなたの心配が本当の理由を持っているかどうかは疑問です。 「時期尚早最適化はすべての悪の根源です。もちろん、テキストを切り捨てると、通常、テキストが途切れることになります。 – TaW

+0

私は自分のコードでそれをテストしました。それはテキストボックスのテキストの中央を設定して、それが私が望むものでした。私はそれがすべてのコンテンツでうまくいくかどうかはわかりませんが、良い方が良いです。 –

関連する問題