Здравствуйте, Werder, Вы писали:
W>использую GetTextExtendPoint32W для моноширинного отлично работает. А какова методика в случае немоноширинных шрифтов?
В немоноширинных шрифтах расстояние между буквами (если можно так выразиться) может отличаться в зависимости от самих букв.
Например, расстояние между "у" и "л" одно, а между "у" и "м" — другое.
Из-за этого, "ширина" буквы "у" может отличаться.
Имею скафандр — готов путешествовать!
Re[3]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Werder, Вы писали:
W>>использую GetTextExtendPoint32W для моноширинного отлично работает. А какова методика в случае немоноширинных шрифтов?
RB>В немоноширинных шрифтах расстояние между буквами (если можно так выразиться) может отличаться в зависимости от самих букв. RB>Например, расстояние между "у" и "л" одно, а между "у" и "м" — другое. RB>Из-за этого, "ширина" буквы "у" может отличаться.
Ну если если человек пишет про моноширинный шрифт надо понимать что он скорее всего знает то что вы написали. Вопрос в том как измерить ширину символа в таком случае? GetTextExtendPoint32W у меня дает неточный результат для общей длины строки
Re: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>Как определить ширину символа? Немоноширинный шрифт. GetTextExtendPoint дает близкую но не точную величину
В книге Фень Юаня "Программирование графики для Windows" эта проблема рассматривается и приводится функция для более точного определения размера с использованием GetCharABCWidths
Re[2]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, MBo, Вы писали:
MBo>Здравствуйте, Werder, Вы писали:
W>>Как определить ширину символа? Немоноширинный шрифт. GetTextExtendPoint дает близкую но не точную величину
MBo>В книге Фень Юаня "Программирование графики для Windows" эта проблема рассматривается и приводится функция для более точного определения размера с использованием GetCharABCWidths
не могли бы вы поделиться кодом?
Re: Как определить ширину символа? Немоноширинный шрифт
In addition, because the width of a glyph can vary by context, applications should use GetTextExtentExPoint to determine line length rather than using cached character widths.
2. Виндовые WCHAR это не символы. Они так называюся по историческим причинам. Это UTF-16 code unit (которых 65536), один или два которых составляют Unicode code point (которых в данный момент ~1.1 млн), от нуля до бесконечности которых комбинируются в один символ, причем какой конкретно, зависит не только от них, но и от соседних символов и от настроения рендерилки текста, которое зависит от версии винды, меняется в зависимости от наличия подходящих шрифтов и включенности ClearType.
3. Текст всегда должен рендериться только строкой целиком, если при этом нужно знать, куда в отрендереной картинке ставить курсор и в каком месте можно переносить на новую строку (напр. текстовый редактор), то надо смотреть в сторону DirectWrite или Uniscribe.
Re[4]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>Ну если если человек пишет про моноширинный шрифт надо понимать что он скорее всего знает то что вы написали.
Это совершенно НЕ очевидно. Proportional шрифт отличается он Monospace тем, что буквы имеют разную ширину.
rus blood писал о Kerning, который может быть разным у различных пропорциональных шрифтов.
Ну и, конечно, если человек всё знает — он ни о чем не спрашивает
W>Вопрос в том как измерить ширину символа в таком случае? GetTextExtendPoint32W у меня дает неточный результат для общей длины строки
Для полной точности я вызываю DrawText с DT_CALCRECT.
Re[5]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Werder, Вы писали:
W>>Ну если если человек пишет про моноширинный шрифт надо понимать что он скорее всего знает то что вы написали.
VF>Это совершенно НЕ очевидно. Proportional шрифт отличается он Monospace тем, что буквы имеют разную ширину. VF>rus blood писал о Kerning, который может быть разным у различных пропорциональных шрифтов. VF>Ну и, конечно, если человек всё знает — он ни о чем не спрашивает
W>>Вопрос в том как измерить ширину символа в таком случае? GetTextExtendPoint32W у меня дает неточный результат для общей длины строки
VF>Для полной точности я вызываю DrawText с DT_CALCRECT.
Так что нужно использовать GetTextExtendPoint32W или GetCharABCWidths? И можно ли считать длину строки в цикле по длине симоволов?
Re[6]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
VF>>Для полной точности я вызываю DrawText с DT_CALCRECT.
W>Так что нужно использовать GetTextExtendPoint32W или GetCharABCWidths?
"Для полной точности я вызываю DrawText с DT_CALCRECT."
W>И можно ли считать длину строки в цикле по длине симоволов?
В каком цикле? Каждую букву отдельно???
W>>>Ну если если человек пишет про моноширинный шрифт надо понимать что он скорее всего знает то что вы написали.
Re[6]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>И можно ли считать длину строки в цикле по длине симоволов?
Т.е., считать ширину отдельных букв, а потом складывать в общую длину?
Считать можно, результат может быть неверный.
Вот VladFein умное слово написал — kerning.
Суть не только в том, что у разных букв разная ширина.
Но и в том, что буквы в тексте "наползают" друг на друга.
И это "наползание" зависит от сочетаний букв, т.е. от самого текста.
Имею скафандр — готов путешествовать!
Re[7]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Werder, Вы писали:
VF>>>Для полной точности я вызываю DrawText с DT_CALCRECT.
W>>Так что нужно использовать GetTextExtendPoint32W или GetCharABCWidths?
VF>
VF>"Для полной точности я вызываю DrawText с DT_CALCRECT."
W>>И можно ли считать длину строки в цикле по длине симоволов?
VF>В каком цикле? Каждую букву отдельно??? VF>
W>>>>Ну если если человек пишет про моноширинный шрифт надо понимать что он скорее всего знает то что вы написали.
VF>
У меня задача определить сколько символов из строки умещается в отрезке заданной длины. Я думаю что оптимальнее сложением длин отдельных символов это делать.
Re[7]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Werder, Вы писали:
W>>И можно ли считать длину строки в цикле по длине симоволов?
RB>Т.е., считать ширину отдельных букв, а потом складывать в общую длину? RB>Считать можно, результат может быть неверный. RB>Вот VladFein умное слово написал — kerning. RB>Суть не только в том, что у разных букв разная ширина. RB>Но и в том, что буквы в тексте "наползают" друг на друга. RB>И это "наползание" зависит от сочетаний букв, т.е. от самого текста.
И что дальше делать? Вы можете предложить решение задачи которую я описал в предыдущем сообщении?
Re[8]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>У меня задача определить сколько символов из строки умещается в отрезке заданной длины. Я думаю что оптимальнее сложением длин отдельных символов это делать.
Длина строки НЕ равна сумме длин отдельных символов.
Re[3]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>Здравствуйте, MBo, Вы писали:
MBo>>Здравствуйте, Werder, Вы писали:
W>>>Как определить ширину символа? Немоноширинный шрифт. GetTextExtendPoint дает близкую но не точную величину
MBo>>В книге Фень Юаня "Программирование графики для Windows" эта проблема рассматривается и приводится функция для более точного определения размера с использованием GetCharABCWidths
W>не могли бы вы поделиться кодом?
Здравствуйте, Werder, Вы писали:
W>У меня задача определить сколько символов из строки умещается в отрезке заданной длины. Я думаю что оптимальнее сложением длин отдельных символов это делать.
Неправильное решение может быть самым быстрым, но никак не оптимальным.
Я бы попробовал DrawText всю строку; если не помещается — половину, и т.д. Методом половинного деления.
Re[8]: Как определить ширину символа? Немоноширинный шрифт
Здравствуйте, Werder, Вы писали:
W>У меня задача определить сколько символов из строки умещается в отрезке заданной длины. Я думаю что оптимальнее сложением длин отдельных символов это делать.
Когда-то делал подобное следующим образом (это если ничего не путаю, давно дело было):
Делим длинну (места куда хотим пометить строку) на среднюю длинну символа (можно получить ч-з WinAPI), для моноширинных сразу получаем корректное кол-во символов.
Для отстальных: прибавляем или отнимаем по символу, пока не достигнем просветления.
Как вариант оптимизации: кернинг работает только для пар символов (т.е. остальная строка не учитывается), можно оставлять только несколько символов в строке.