2016-03-28 71 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

我已經在我的代碼中對其進行了測試。它已經設置了文本框的文本中間,這正是我想要的。我不確定它在所有內容上都能正常工作,但越好越好。 –