![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 08.10.2008
Сообщений: 27
|
![]()
Приветствую!
Имеется задача отрисовывать текст по выбранному шрифту на Image в определенном формате. При этом текст сразу отрисовываться сразу одной строкой не может, т.к. элементы строки содержат разный цвет, поэтому отрисовка текста происходит в цикле со смещением вправо. Проблема возникает в том, что на выходе текст обрезается, т.к. по каким-то причинам некорректно рассчитывается его ширина. Особенно это проглядывается при выборе курсива - там вообще ширина получается идентичной, что и без курсива почему-то. Но и без курсива проблема имеется. Упрощенный пример задачи: Код:
В качестве решения можно было бы рассчитывать какой-то промежуточный запас (относительно высоты шрифта или еще по какой-то зависимости) и добавлять его на каждой итерации, однако по условиям задачи пробелов быть не должно. Подскажите, пожалуйста, как можно поборот данную проблему? Спасибо! Последний раз редактировалось The_Immortal; 17.06.2023 в 23:59. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 178
|
![]()
Не текст обрезается, а просто фон текстовой области накладывается на соседнюю букву, используйте кисть со стилем bsclear при отрисовке текста и не нужны будут костыли
Код:
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 08.10.2008
Сообщений: 27
|
![]()
DIONISKA, забыл еще уточнить, что мне необходима белая подложка, т.к. текст этот отрисовывается на фоне других цветных элементов (того же цвета, что и сам текст), поэтому его надо выделять через белую подложку, соответственно bsclear использовать не могу...
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 178
|
![]()
вы же читали код выше? белый прямоугольник отрисовывается в самом начале, заливка области сплошной кистью белым цветом (bsSolid):
Код:
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 08.10.2008
Сообщений: 27
|
![]()
DIONISKA, я, вероятно, некорректно изъясняюсь.
Мне необходимо, чтобы фон самого текста был на белом фоне. В примере ниже фон изображения не белый (например, черный) и средний черный '0' может быть виден только с не черной (например, белой) подложкой. Мне необходимо, чтобы текст выводился с белым фоном, т.к. на заднем плане (общий закраска Image) может быть любой цвет, но не белый. Именно по этим причинам: |
![]() |
![]() |
![]() |
#6 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]()
The_Immortal, если с bsclear кистью текст не обрезается, то просто добавьте отрисовку белого прямоугольника-фона для текста перед выводом текста, что и предлагает DIONISKA.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 08.10.2008
Сообщений: 27
|
![]()
BDA, я не врубаюсь как это сделать...
Пробовал вот так. Все равно обрезается. Где я косячу? Последний раз редактировалось The_Immortal; 19.06.2023 в 00:03. |
![]() |
![]() |
![]() |
#8 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]()
Можно, например, вывести весь текст белым цветом на белом фоне, а потом уже нужным цветом на прозрачном:
Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 178
|
![]()
Странная у вас конечно задача..
Тут если подумать есть минмум 4 решения: 1. Просто отисовать текст дважды: первый с заливкой, второй без заливки - это самый простой и быстрый костыль. 2. Отрисовывать текст с последней буквы и до первой в обратном порядке, но тут может что-то пойти не так на italic/bold italic шрифтах с наклоном в обратную сторону или шрифтах с завитушками 3. Отрисовывать где-нибудь отдельно, например на отдельном битмапе, а потом уже его рисовать на вашем Image1.Canvas, можно также с задействованием blend-функций, и тп 4. Как предлагал ранее товарищ BDA: сначала подсчитать размеры всего текста (с помощью TextWidth/TextHeight/TextRect), нарисовать прямоугольник, а потом уже поверх отрисовывать текст. А не получается у вас потому, что нужно сначала посчитать размеры текстовой области, затем нарисовать прямоугольник, а потом уже в цикле рисовать текст с bsclear. Собственно почему происходит такой эффект? Потому что когда вы посимвольно выводите/получаете размеры текста, то область, в которую вписывается каждая буква перекрывает область предыдущей и опционально следующей(у рукописных шрифтов, с завитушками и тп) буквы, а если эту область залить, то она закрасит часть окружающих букв. PS: если ограничиться моноширными шрифтами, то эта проблема не возникнет Последний раз редактировалось DIONISKA; 19.06.2023 в 01:32. |
![]() |
![]() |
![]() |
#10 | |||
Пользователь
Регистрация: 08.10.2008
Сообщений: 27
|
![]()
DIONISKA,
Цитата:
Цитата:
Цитата:
Последний раз редактировалось The_Immortal; 19.06.2023 в 21:30. |
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обрезка текста в ячейке таблицы | Владимир1989 | JavaScript, Ajax | 5 | 28.01.2016 20:21 |
Пробелы при отрисовке текста | quqeiqa2 | C# (си шарп) | 0 | 29.10.2015 01:36 |
Баг в отрисовке и подсчете на Канве | Silwerwing | Помощь студентам | 1 | 23.04.2013 19:04 |
Баг в отрисовке и подсчете на Канве | Silwerwing | Общие вопросы Delphi | 0 | 14.04.2013 12:08 |
отображение текста на канве | belyjj | Компоненты Delphi | 3 | 12.04.2011 13:38 |