![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Как определить, сколько максимально символов заданного шрифта (TrueType или системного) поместится на ширине в пикселах? Т.е. ширина компонента известна, надо определсить длину строки, чтобы она заняла всю ширину компонента.
|
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Добавлено @ 21:44 Подсчёт маскимального кол-ва символов помещающихся на Canvas'е TImage. |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
Вместо придумывания велосипеда для переноса текста можно воспользоватся функцией DrawText.
|
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Спасибо Yanis
А что делать, если у окошка известно тольно hWnd? Я тут покопался в MSDN и нашел, что с помощью GetTextMetrics можно получить структуру TTextMetric, а в ней есть поля tmAveCharWidth: Longint;(ср.ширина символа) и tmMaxCharWidth: Longint;(макс.ширина символа) в относительных единицах. Спрашивается: как эти единицы в пикселы перевести? Добавлено @ 23:28 s-mike Мне вот именно надо велосипед придумать Это сообщение отредактировал(а) tripsin - 17.5.2005, 23:30 |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
Функция DrawText может и TextWidth заменить. И в качестве входного параметра ей как раз и нужно DC окна. |
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
А что общественность думает по поводу вот этого кода? :
|
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
Больше напоминает изобретание велосипеда |
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Мне кажется это лучше, чем простой подбор.
|
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
tripsin, ну зачем же простой подбор? DrawText с флагом DT_CALCRECT возвращает точные размеры текста.
|
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Мне нужно разбить длинную строку, на кусочки такой ширины, чтобы они влезали в окно (вручную). Выводить их сразу не надо и DrawText (при всех его достоинчтвах) мне не нужен.
З.Ы. С DT_CALCRECT расчитывается прямоугольник вывода, а он как раз известен. |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
tripsin, ты все таки не понял, DrawText нужно вычислять длину строки. Она тебе возвратит минимальный прямоугольник, необходимый для вывода строки. Вот и найди ширину этого прямоугольника. Это и будет ширина строки. Есть еще GetTextExtentPoint32, используемая для TextWidth.
|
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
s-mike Это ты не понял. Задача в точности до наоборот. У меня уже есть прямоугольник, и надо посчитать сколько символов заданного шрифта влезет в этот прямоугольник по ширине. На выходе должно быть количество символов, а не размеры прямоугольника.
|
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
tripsin, я говорю, что с помощью этих функций, написанных всего одной строкой, можно заменить код, приведенный тут: http://forum.vingrad.ru/index.php?showtopi...ndpost&p=413987. Я думаю, что использовать среднюю ширину символов не стоит, тут нужна точность. Я думаю так. У нас есть слова, разделенные пробелом. Читаем последовательно слова, суммируем их ширину. При добавлении каждого следующего слова, если слова превышают максимальную длину строки, то новое слово не добавляем, а переходим на следующую строку. Я бы и код написал, жаль времени сейчас нет, поздно уже.
|
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Хм... Я подожду |
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
То, что ты описал делает функция WrapText.
Вот ее-то как раз и надо найти. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |