Требуется:
Знать ширину каждой буковки в слове и, таким образом, ширину самого слова (ед. измерения - любые, например, пиксели).
Известно:
Тип, начертание, размер шрифта.
Вопрос:
Есть ли у данной задачи хоть какое-нибуль решение?
Примечание:
VBA.Visio
Как узнать ширину (в пкс) буквы шрифта?
Модератор: Naeel Maqsudov
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
У этой задачи есть решение, но оно целиком и полностью WinAPI-шное.
Так как ширина буквы не известна до тех пор, пока буква не будет нарисована для этого используют функцию WinAPI для рисования текста на контексте устройства. (DrawText и другие функции семейств GDI и Device context)
Что такое контекст устройства: Это плоскость из пикселей, учитывающая разрешающую способность и прочие возможности некоторого устройства, например, экрана или принтера. Так буква А из Arial 14пт на разных контекстах устройств займет разное количество пикселей.
(Поэтому, кстати MSExcel часто неодинаково отображает данные на экране и на бумаге - рисует на разных Device Context-ах. Тогда как некоторые другие програмы рисуют на одном, и лишь проецируют на разные (тогда получится одинаково и на экране и на бумаге)).
Итак, надо достучаться до контекста устройства, используемого Visio, что либо нереально, либо (если все-таки реально) будет зависеть от версии Visio. Также можно для этой операции создать свой контекст устройства (Потом придется экспериментально подобрать коэффициент пересчета в единицы, используемые Visio. Зависимость будет линейной).
А затем вызвать функцию DrawText со нужным текстом. Но указав в параметрах специальный флаг, который означает что рисовать ничего нен надо, а надо только определить размер прямоугольной области, которую займет текст. Т.е. можно получить ширину всего слова целиком. (На самом деле сам Visio так и делает, и потом пересчитывает это в те единицы, которые указаны в настройках.
Т.о. для решения Вашей задачи надо освоить с десяток функций WinAPI (вызвать их из VBA не проблема). И поставить много экспериментов, по поводу пересчета единиц.
Так как ширина буквы не известна до тех пор, пока буква не будет нарисована для этого используют функцию WinAPI для рисования текста на контексте устройства. (DrawText и другие функции семейств GDI и Device context)
Что такое контекст устройства: Это плоскость из пикселей, учитывающая разрешающую способность и прочие возможности некоторого устройства, например, экрана или принтера. Так буква А из Arial 14пт на разных контекстах устройств займет разное количество пикселей.
(Поэтому, кстати MSExcel часто неодинаково отображает данные на экране и на бумаге - рисует на разных Device Context-ах. Тогда как некоторые другие програмы рисуют на одном, и лишь проецируют на разные (тогда получится одинаково и на экране и на бумаге)).
Итак, надо достучаться до контекста устройства, используемого Visio, что либо нереально, либо (если все-таки реально) будет зависеть от версии Visio. Также можно для этой операции создать свой контекст устройства (Потом придется экспериментально подобрать коэффициент пересчета в единицы, используемые Visio. Зависимость будет линейной).
А затем вызвать функцию DrawText со нужным текстом. Но указав в параметрах специальный флаг, который означает что рисовать ничего нен надо, а надо только определить размер прямоугольной области, которую займет текст. Т.е. можно получить ширину всего слова целиком. (На самом деле сам Visio так и делает, и потом пересчитывает это в те единицы, которые указаны в настройках.
Т.о. для решения Вашей задачи надо освоить с десяток функций WinAPI (вызвать их из VBA не проблема). И поставить много экспериментов, по поводу пересчета единиц.