brockeu Ответов: 1

Почему это отличается?


string text = "aaaaaa";
float width1 = e.Graphics.MeasureString(
    text,
    new Font("calibri", 12, GraphicsUnit.Pixel)).Width;

float width2 = 0;
for (int i = 0; i < text.Length; i++)
{
    width2 += e.Graphics.MeasureString(
        text[i].ToString(),
        new Font("calibri", 12, GraphicsUnit.Pixel)).Width;
}

я хочу измерить размер Храктера.
почему width2 и width1 не совсем одинаковы?
и как я могу правильно измерить характер?

Что я уже пробовал:

это моя лучшая идея... наверное.

Ralf Meier

Вы не измеряете ширину каждого символа внутри строки - для этого вам следует использовать подметод .Подстрока из вашей строковой переменной ...

1 Ответов

Рейтинг:
7

OriginalGriff

Потому что ширина строки не является суммой Ширин всех символов, за исключением непропорциональных (или фиксированных по ширине) шрифтов.
В шрифте фиксированной ширины все символы имеют одинаковую ширину, поэтому строка - это ширина символа, умноженная на количество символов:
WIIIIILL
12222234

Но пропорциональным шрифтом:
WIIIIILL
12222234

Символы не одинаковой ширины.
Это не вызывает вашей проблемы, но начинает указывать на то, почему это проблема - потому что пропорциональные шрифты могут иметь и другие функции, такие как парный Кернинг:
ВАВАВА
121212

ВАВАВА
121212

Что происходит здесь, так это то, что W и A "заправлены вместе", потому что часть A "помещается" под W вместо того, чтобы ждать, пока он закончит и добавится небольшой зазор:
ВАВАНАВА
(есть и другие эффекты, но это легче всего показать)
Таким образом, вы не можете просто измерить каждый символ и предположить, что строка будет одинаковой длины!

[edit]добавлены разрывы строк для удобства чтения [/edit]


Mehdi Gholam

Я собирался сказать то же самое, опереди меня, 5'ed!

Maciej Los

5ед!