Определите, насколько широко представленный символ в .NET.

Предположим, что я нарисовал символ "A" на экране с шрифтом 14 размера в Arial Regular. Есть ли способ в С# для вычисления количества пикселей в ширину?


Спасибо за все ответы. Способ, которым я обрабатываю текст, - это ESRI ArcEngine, который вызывает вызовы GDI или GDI + (я не знаю, какой) в кругу по модам с помощью динамического движка DynamicDisplay.

Ответ 1

Это зависит от используемого механизма рендеринга..NET может использовать GDI или GDI+. Переключение может быть выполнено путем установки свойства UseCompatibleTextRendering соответственно или вызова метода Application.SetCompatibleTextRenderingDefault.

При использовании GDI + вы должны использовать MeasureString:

string s = "A sample string";

SizeF size = e.Graphics.MeasureString(s, new Font("Arial", 24));

При использовании GDI (т.е. собственного рендеринга Win32) вы должны использовать класс TextRenderer:

SizeF size = TextRenderer.MeasureText(s, new Font("Arial", 24));

Более подробная информация приведена в этой статье:

Текстовое рендеринг: создание готовых к использованию приложений с использованием сложных скриптов в элементах управления Windows Forms

Обратите внимание, что выше сказанное касается Windows Forms. В WPF вы будете использовать FormattedText

Ответ 3

Вы не говорите, как вы "визуализируете" его, но если у вас есть строка, вы можете использовать MeasureString.

Ответ 4

Graphics.MeasureString получит размер в текущих графических единицах.

Ответ 5

Не совсем, вы можете сделать только оценку. Подсказка TrueType, кернинг и наложение глифов делают измерение отдельных персонажей практически невозможным. Некоторый код:

    public float GetAWidth() {
        using (var font = new Font("Arial", 14)) {
            SizeF size = TextRenderer.MeasureText(new string('A', 100), font);
            return size.Width / 100;
        }
    }

Это возвращает 13.1 на моей машине. Избегайте этого.

Ответ 7

Свойство MeasureString указывает, как широко поле должно использоваться для отображения строки, что позволяет некоторым "отломам" для выступов. В частности, заявленная ширина "a" плюс сообщенная ширина "b" может быть намного больше, чем сообщенная ширина "ab". В грубом приближении я бы предположил, что если вы хотите ширину "a", вы вычитаете ширину "||", от ширины "| a |". Обратите внимание, что это будет только приблизительным, как из-за проблем округления, так и из-за того, что ширина символов зависит от контекста. Например, во многих шрифтах строка "TATATATAT" может казаться более узкой, чем "AAAATTTTT", потому что A может располагаться под T.