Measure a String without using a Graphics object?

前端 未结 5 1059
梦谈多话
梦谈多话 2020-11-27 19:57

I am using pixels as the unit for my font. In one place, I am performing a hit test to check if the user has clicked within the bounding rectangle of some text on screen. I

相关标签:
5条回答
  • 2020-11-27 20:25

    You don't need to use the graphics object that you are using to render to do the measuring. You could create a static utility class:

    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;
        }
    }
    

    It might be worthwile, depending on your situation to set the dpi of the bitmap as well.

    0 讨论(0)
  • 2020-11-27 20:29

    If you have a reference to System.Windows.Forms, try using the TextRenderer class. There is a static method (MeasureText) which takes the string and font and returns the size. MSDN Link

    0 讨论(0)
  • 2020-11-27 20:33

    MeasureString method in @NerdFury answer will give a higher string width than expected.Additional info you can find here. If you want to measure only the physical length please add this two lines :

    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    result = 
      g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);
    
    0 讨论(0)
  • 2020-11-27 20:37

    This may not be but a repeat of others, but my problem was the unwanted Graphics object as well. After listening to the above frustrations I simply tried:

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

    (where 'content' is the string to measure and cardfont the font it is in)

    ... and was in luck. I could use the result to set the width of my column in VSTO.

    0 讨论(0)
  • 2020-11-27 20:41

    This example does great job of illustrating the use of FormattedText. FormattedText provides low-level control for drawing text in Windows Presentation Foundation (WPF) applications. You can use it to measure the Width of a string with a particular Font without using a Graphics object.

    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;
    }
    

    Include WindowsBase and PresentationCore libraries.

    0 讨论(0)
提交回复
热议问题