Измерить строку без использования графического объекта? - PullRequest
40 голосов
/ 16 июня 2009

Я использую пиксели в качестве единицы для моего шрифта. В одном месте я выполняю тест на попадание, чтобы проверить, нажал ли пользователь внутри ограничительного прямоугольника какого-либо текста на экране. Мне нужно использовать что-то вроде MeasureString для этого. К сожалению, код, выполняющий тест на попадание, находится глубоко внутри библиотеки, которая не имеет доступа к Graphics объекту или даже Control.

Как получить ограничивающий прямоугольник строки с заданным шрифтом без использования класса Graphics? Зачем мне даже объект Graphics, если мой шрифт в пикселях?

Ответы [ 5 ]

47 голосов
/ 16 июня 2009

Если у вас есть ссылка на System.Windows.Forms, попробуйте использовать класс TextRenderer. Есть статический метод (MeasureText), который принимает строку и шрифт и возвращает размер. MSDN Link

23 голосов
/ 16 июня 2009

Вам не нужно использовать графический объект, который вы используете для визуализации, чтобы сделать измерение. Вы можете создать статический служебный класс:

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 для растрового изображения.

11 голосов
/ 08 ноября 2012

MeasureString метод в ответе @NerdFury даст большую ширину строки, чем ожидалось. Дополнительную информацию вы можете найти здесь . Если вы хотите измерить только физическую длину, добавьте две строки:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result = 
  g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);
1 голос
/ 18 июня 2013

Этот пример отлично иллюстрирует использование FormattedText. FormattedText обеспечивает низкоуровневое управление для рисования текста в приложениях Windows Presentation Foundation (WPF). Вы можете использовать его для измерения ширины строки с определенным шрифтом без использования графического объекта.

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 голосов
/ 26 сентября 2015

Возможно, это не повторение других, но моей проблемой был также нежелательный объект Graphics. Выслушав вышесказанное, я просто попытался:

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

(где 'content' - строка для измерения и определения шрифта, в котором она находится)

... и повезло. Я мог бы использовать результат, чтобы установить ширину моего столбца в VSTO.

...