Подтвердить что ты не робот

Измерить строку без использования объекта Graphics?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

В этом примере отлично иллюстрируется использование FormattedText. FormattedText обеспечивает низкоуровневое управление для рисования текста в приложениях Windows Presentation Foundation (WPF). Вы можете использовать его для измерения ширины строки с определенным шрифтом без использования объекта 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.

Ответ 5

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

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

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

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