Ответ 1
Если у вас есть ссылка на System.Windows.Forms, попробуйте использовать класс TextRenderer. Существует статический метод (MeasureText), который принимает строку и шрифт и возвращает размер. Ссылка MSDN
Я использую пиксели в качестве единицы для моего шрифта. В одном месте я выполняю тест на попадание, чтобы проверить, щелкнул ли пользователь в ограничительном прямоугольнике какого-либо текста на экране. Для этого мне нужно использовать что-то вроде MeasureString
. К сожалению, код, выполняющий тестовый тест, находится глубоко внутри библиотеки, которая не имеет доступа к объекту Graphics
или даже к Control
.
Как получить ограничивающий прямоугольник строки с учетом шрифта без использования класса Graphics
? Зачем мне нужен объект Graphics
, когда мой шрифт находится в пикселях?
Если у вас есть ссылка на System.Windows.Forms, попробуйте использовать класс TextRenderer. Существует статический метод (MeasureText), который принимает строку и шрифт и возвращает размер. Ссылка MSDN
Вам не нужно использовать графический объект, который вы используете для рендеринга для измерения. Вы можете создать статический класс утилиты:
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 в растровом изображении.
MeasureString
метод в ответе @NerdFury даст более высокую ширину строки, чем ожидалось. Дополнительную информацию вы можете найти здесь. Если вы хотите измерить только физическую длину, добавьте две строки:
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result =
g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);
В этом примере отлично иллюстрируется использование 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.
Это может быть не повторение других, но моей проблемой был и нежелательный объект Graphics. Выслушав приведенные выше фрустрации, я просто попробовал:
Size proposedSize = new Size(int.MaxValue, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.NoPadding;
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags);
(где "content" - это строка для измерения и cardfont шрифт, в котором он находится)
... и ему повезло. Я мог бы использовать результат, чтобы установить ширину моего столбца в VSTO.