Можно ли рассчитать, сколько символов поместится в метке фиксированной ширины, если шрифт предоставлен в C #?

У меня фиксированная ширина (высота не проблема) компонент метки в C #. Теперь я хочу рассчитать, сколько примерно символов уместится на эту ширину, если размер шрифта и семейство шрифтов предоставлены. Я знаю, что для каждого символа при рендеринге используются разные пиксели, поэтому получить точное количество символов невозможно. Но я думаю, если мы возьмем букву, которая не занимает больше пикселей, и вычислим ее с учетом этой буквы, мы сможем получить приблизительное количество символов, которые уместятся в фиксированной ширине в соответствии с предоставленным шрифтом. Итак, если мы рассматриваем символ «W» как самый широкий, то как я могу рассчитать количество символов «W», подходящих для данной ширины.

Я не могу использовать метод GDI + Graphics.MeasureString, так как я хочу его до рендеринга персонажа.

Когда я использую GDI TextRenderer класс

SizeF sizeOfW = TextRenderer.MeasureText("W", new Font("DejaVu Sans", 28.0F));

Он возвращает {59.0, 44.0}, что, как я считаю, совершенно неверно, потому что, если я принял ширину метки равной 80 пикселей, согласно приведенным выше расчетам, у него будет только одна буква «W», но на самом деле это не так.

Так может ли кто-нибудь сказать, где я ошибаюсь?


person ganesh    schedule 19.01.2013    source источник
comment
На этой этикетке изображено более одной буквы W с одинаковым шрифтом?   -  person Uthistran Selvaraj    schedule 19.01.2013
comment
Он показывает 2 w, которых не должно быть, потому что 59 + 59 = 118, а между 80 и 118 большая разница.   -  person ganesh    schedule 19.01.2013
comment
Так что TextRenderer.MeasureText("WW", new Font("DejaVu Sans", 28.0F)) вернется для вас?   -  person AgentFire    schedule 19.01.2013
comment
Этот вопрос и ответы на него (также не принятый ответ) могут дать правильное направление   -  person Steve    schedule 19.01.2013


Ответы (1)


Вы можете использовать следующее:

var g=Graphics.FromHwnd(label1.Handle);
int charFitted, linesFitted;
g.MeasureString(mystring, label1.Font, label1.Size, null, 
                 out charFitted, out linesFitted);

После выполнения у вас будет charFitted количество символов, которые может показать label1.

person Tobia Zambon    schedule 01.08.2013
comment
Graphics.MeasureString не заменяет TextRenderer.MeasureText. - person Hans Passant; 01.08.2013
comment
@HansPassant Я не думаю, что OP запрашивает замену MeasureText, и он не хочет обязательно ее использовать. OP хочет решение для расчета, сколько символов данной строки может быть помещено в метку, и я думаю, что это могло бы быть решением. - person Tobia Zambon; 02.08.2013