![]() |
|
Модераторы: 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.
Вот ее-то как раз и надо найти. |
|||
|
||||
| s-mike |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
Добавлено @ 09:35 Но она немного не тем занимается, она по буквам разбивает, а не по ширине слов. |
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Тем-тем. Все зависит от переданных параметров.
function WrapText(const Line, BreakStr: string; BreakChars: TSysCharSet; MaxCol: Integer): string;overload; По умолчанию BreakChars = [' ', ' -' , #9], т.е. как раз на слова и разбивается. Но считает она не ширину строки в пикселах, а просто, что бы количество символов было меньше MaxCol. |
|||
|
||||
| s-mike |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 9 Всего: 16 |
Я об этом и говорю:
|
||||
|
|||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Мдя... уж!
tripsin обрати внимание на следующие функции: GetCharWidth32, GetCharABCWidths. Вот например простейший пример для GetCharWidth32:
Это сообщение отредактировал(а) Girder - 19.5.2005, 12:31 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| tripsin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 10.4.2005 Где: Талица Репутация: нет Всего: 3 |
Girder Твой код не работает! Ты сам-то пробовал. Он до строки "Caption:=IntToStr(i-1); //Типо... ответ" - даже не доходит.
GetCharWidth32(DC,0,255,a); - это че за вызов-то? Вставь проверку: if not GetCharWidth32(DC,0,255,a) then ShowMessage('Хрена! Не работает!'); Кста. В твоем коде в DC надо выбирать шрифт с помощью SelectObject, иначе будет использоваться системный шрифт. Ну блииииин!! Короче нужна функция такого вида: function Number_Of_Chars_In_Pixel_Width(Pixel_Width_Of_window: Integer; WindowFont: TFont): Integer; Может хоть так понятнее. Как определить ширину имеющейся строки я и так знаю. Пока у этой задачи я нашел 2 ответа: 1. Подбор ширины строки в цикле, как показал Yanis(по "среднему" символу, или с помошью функций группы GetCharWidth (но для них нужен конкретный текст) 2. Мой вариант с использованием метрик тескта. Мне только интересно - корректный это код или нет (работает точно). |
|||
|
||||
| Girder |
|
||||||||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
1.
2.
3.
Это сообщение отредактировал(а) Girder - 19.5.2005, 15:26 -------------------- Как слышим, так и пишим. Истина где-то там... |
||||||||||
|
|||||||||||
| Guest |
|
|||
|
Unregistered |
Это я, tripsin
Girder Ты уж не обижайся |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Лови... примерную реализацию
Это сообщение отредактировал(а) Girder - 19.5.2005, 15:32 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
![]()
|
| Правила форума "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. |