2009-06-16 20 views
38

我使用像素作爲我的字體的單位。在一個地方,我正在執行命中測試來檢查用戶是否在屏幕上某些文本的邊界矩形內單擊了。我需要爲此使用類似MeasureString的東西。不幸的是,執行命中測試的代碼深藏在無法訪問Graphics對象或甚至是Control的庫中。在不使用圖形對象的情況下測量字符串?

如何在不使用Graphics類的情況下獲取給定字體的字符串的邊界框?爲什麼我的字體像素時甚至需要Graphics對象?

+0

如果您沒有控件,您有什麼?我假設字體和字符串,但還有什麼? – micahtan 2009-06-16 19:09:47

+0

沒有別的。我的圖書館是一種場景圖。我試圖避免依賴於System.Drawing和System.Windows.Forms – 2009-06-17 04:29:34

回答

44

如果您有對System.Windows.Forms的引用,請嘗試使用TextRenderer類。有一個靜態方法(MeasureText),它接受字符串和字體並返回大小。 MSDN Link

+2

TextRenderer的小問題是它使用整數作爲返回值,如果您需要子像素精度,會導致問題。否則,這是一個很好的選擇。 – 2010-09-01 03:45:14

23

您不需要使用正在使用的圖形對象來進行測量。你可以創建一個靜態實用工具類:

public static class GraphicsHelper 
{ 
    public static SizeF MeasureString(string s, Font font) 
    { 
     SizeF result; 
     using (var image = new Bitmap(1, 1)) 
     { 
      using (var g = Graphics.FromImage(image)) 
      { 
       result = g.MeasureString(s, font); 
      } 
     } 

     return result; 
    } 
} 

這可能是歡顏,根據您的情況來設置位圖的DPI爲好。

10

MeasureString在@NerdFury答案中的方法會給出比預期更高的字符串寬度。您可以找到here的附加信息。如果你想只測量物理長度,請添加此兩行:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
result = 
    g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic); 
1

這個例子確實說明使用FormattedText的偉大的工作。 FormattedText爲在Windows Presentation Foundation(WPF)應用程序中繪製文本提供了低級控制。您可以使用它來測量具有特定Font的字符串的寬度,而不使用Graphics對象。

public static float Measure(string text, string fontFamily, float emSize) 
{ 
    FormattedText formatted = new FormattedText(
     item, 
     CultureInfo.CurrentCulture, 
     System.Windows.FlowDirection.LeftToRight, 
     new Typeface(fontFamily), 
     emSize, 
     Brushes.Black); 

    return formatted.Width; 
} 

包含WindowsBase和PresentationCore庫。

0

這可能不是別人的重複,但我的問題是不需要的圖形對象。聽了上面的挫折後,我只是嘗試:

Size proposedSize = new Size(int.MaxValue, int.MaxValue); 
TextFormatFlags flags = TextFormatFlags.NoPadding; 
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags); 

(其中,「內容」是衡量和cardfont的字體是在字符串)

...並且是運氣。我可以使用結果來設置VSTO中列的寬度。

相關問題