Страница 1 из 1

Как узнать ширину (в пкс) буквы шрифта?

Добавлено: 30 ноя 2005, 11:26
Sokl
Требуется:
Знать ширину каждой буковки в слове и, таким образом, ширину самого слова (ед. измерения - любые, например, пиксели).

Известно:
Тип, начертание, размер шрифта.

Вопрос:
Есть ли у данной задачи хоть какое-нибуль решение?

Примечание:
VBA.Visio

Добавлено: 05 дек 2005, 18:14
Naeel Maqsudov
У этой задачи есть решение, но оно целиком и полностью WinAPI-шное.
Так как ширина буквы не известна до тех пор, пока буква не будет нарисована для этого используют функцию WinAPI для рисования текста на контексте устройства. (DrawText и другие функции семейств GDI и Device context)

Что такое контекст устройства: Это плоскость из пикселей, учитывающая разрешающую способность и прочие возможности некоторого устройства, например, экрана или принтера. Так буква А из Arial 14пт на разных контекстах устройств займет разное количество пикселей.
(Поэтому, кстати MSExcel часто неодинаково отображает данные на экране и на бумаге - рисует на разных Device Context-ах. Тогда как некоторые другие програмы рисуют на одном, и лишь проецируют на разные (тогда получится одинаково и на экране и на бумаге)).

Итак, надо достучаться до контекста устройства, используемого Visio, что либо нереально, либо (если все-таки реально) будет зависеть от версии Visio. Также можно для этой операции создать свой контекст устройства (Потом придется экспериментально подобрать коэффициент пересчета в единицы, используемые Visio. Зависимость будет линейной).
А затем вызвать функцию DrawText со нужным текстом. Но указав в параметрах специальный флаг, который означает что рисовать ничего нен надо, а надо только определить размер прямоугольной области, которую займет текст. Т.е. можно получить ширину всего слова целиком. (На самом деле сам Visio так и делает, и потом пересчитывает это в те единицы, которые указаны в настройках.

Т.о. для решения Вашей задачи надо освоить с десяток функций WinAPI (вызвать их из VBA не проблема). И поставить много экспериментов, по поводу пересчета единиц.

Добавлено: 06 дек 2005, 13:14
Sokl
:shock: