Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
1

Отрисовка RTF на канве

20.02.2020, 15:02. Показов 1018. Ответов 30

Добрый день.
Хочу отричовать RTF текст на канве, в идеале мечтаю сотворить что-то вроде:
Delphi
1
function DrawRTF(ARTFText: String; ARect: TRect; ACanvas: TCanvas): boolean;
Много гуглил, вся информация которую нашел упирается в TRichEdit, способов отрисовки без него не нашел (надо еще уметь правильно гугл спростить).
За неимением варианта без TRichEdit пробую рисовать текст с ним - рисует, но есть проблема. Текст рисуется вместе с фоном TRichEdit (белая заливка) и убрать его не могу, делаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with FormatRange do
    begin
       hdc:= ACanvas.Handle;
       hdcTarget:= hdc;
       rc:=  Rect(0, 0,
                  ARight    * 1440 div Screen.PixelsPerInch,
                  ABottom * 1440 div Screen.PixelsPerInch
                 );
       rcPage:= rc;
       chrg.cpMin := 0;
       chrg.cpMax := RichEdit.GetTextLen;
    end;
    SetBkMode(ACanvas.Handle, TRANSPARENT); // <- Вроде должно делать прозрачным и так не работает etBkMode(GetDC(RichEdit.Handle), TRANSPARENT);
    RichEdit.Perform(EM_FORMATRANGE, 1, Integer(@FormatRange));
    RichEdit.Perform(EM_FORMATRANGE, 0, 0);
Подскажите как избавиться от белого фона?
Или как ричовать RTF вообще без RichEdit?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2020, 15:02
Ответы с готовыми решениями:

Некорректная отрисовка графика на канве
Где ошибка? Почему так плохо рисует график?...

Рисование на канве
В программе предусмотреть возможность изменения цвета и стиля линий для каждой из фигур. На...

Рисование на канве
Солнце с 10 лучами вращается против часовой стрелки с дискретом 100/сек. Длина цикла 30 сек. Запуск...

Перемещение по канве.
Есть некий объект, который мышью перемещяют по Canvas. Canvas помещен в ScrollViewer. При попытке...

30
2218 / 1146 / 418
Регистрация: 15.11.2015
Сообщений: 4,573
20.02.2020, 15:49 2
А если нарисовать на Image, у которого белый задан как прозрачный цвет?
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
20.02.2020, 15:53  [ТС] 3
А потом наложить на целевое изображение ... Вот не пробовал, попробую, но решение костылями попахивает.
Хотелось бы научиться кодить по человечески)
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.02.2020, 19:52 4
RTF? Тот который в WordPad? Руками, без TRichEdit?
...это надо для начала парсер формата создавать... Не уверен что он в каком-то общем виде где-то есть...
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
21.02.2020, 08:10  [ТС] 5
GoodWeather, да, тот самый.
Я как бы и согласен уже и RichEdit в уравнение включить, но отрисовка текста без белого фона за текстом пока не получается. Как ее убрать?
В принципе подошел бы любой другой формат (формаритуемый) который можно редактировать в живую как RTF в RichEdit, но не знаю таких.
0
883 / 403 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
21.02.2020, 08:25 6
Взять и сделать
Delphi
1
2
RichEdit.ParentColor := true;
RichEdit.BorderStyle := bsNone;
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
21.02.2020, 09:42  [ТС] 7
Nanotentacle, это приведет к тому, что на изображение будет передаваться не белый фон, а фон цвета формы.
Прозрачности не будет.
Надо заливку отключить, видимо наследника делать.

Добавлено через 54 минуты
AzAtom, GoodWeather, Nanotentacle,
У TCustomRichEdit есть метод
Delphi
1
procedure WMEraseBKgnd(var Message: TWMEraseBKgnd); message WM_ERASEBKGND;
Вот поидее тут должна быть заливка
Внутри вижу только
Delphi
1
Message.Result:= 1;
Пробовал его переопределить в наследнике, не достиг результата.(
Знаний не хватает побороть этот вопрос.

Добавлено через 16 минут
Цитата Сообщение от RADStudio Посмотреть сообщение
Сообщение от AzAtom
А если нарисовать на Image, у которого белый задан как прозрачный цвет?
А потом наложить на целевое изображение ...
Пробовал, выходит плохо, текст не четкий и буквы имеют частично прилипший фон заданный как прозрачный. Не подходит такой вариант.
0
883 / 403 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
21.02.2020, 09:45 8
Могу посоветовать только озвучить начальную цель, а не средство (отрисовка RichEdit), который вы и реализовываете. Может быть, задача решается проще.

WM_ERASEBKND, имхо, результата не даст, так как, по факту, это кроме мерцания, скорее всего, эффекта не даст.
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
21.02.2020, 09:48  [ТС] 9
Nanotentacle, Так задача озвучена в первом посте.
Необходимо отрисовать RTF текст на картинке (не однотонная).
0
2218 / 1146 / 418
Регистрация: 15.11.2015
Сообщений: 4,573
21.02.2020, 09:57 10
Цитата Сообщение от RADStudio Посмотреть сообщение
Необходимо отрисовать RTF текст на картинке (не однотонная).
Именно форматированный текст из файла?

Label изначально можно сделать с прозрачным фоном.
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
21.02.2020, 10:02  [ТС] 11
AzAtom, именно форматированный из файла.
Label не поддерживает RTF
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
21.02.2020, 16:23 12

Не по теме:

Не, WM_ERASEBKGND это вообще не заливка. Это уведомление/уточнение очистки фона.


Почему именно RTF? Может возьмите HTML?
Цитата Сообщение от RADStudio Посмотреть сообщение
который можно редактировать в живую как RTF в RichEdit
HTML тоже можно.

Добавлено через 1 минуту
А кстати где вы собираетесь редактировать в живую, если у вас будет отрисовка на битмап?
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
21.02.2020, 16:27  [ТС] 13
Цитата Сообщение от GoodWeather Посмотреть сообщение
Почему именно RTF? Может возьмите HTML?
Взял бы, если бы в RichEdit можно было его редактировать в рантайме в живую НЕ ТЕГАМИ.
Цитата Сообщение от GoodWeather Посмотреть сообщение
HTML тоже можно.
Каким образом?
Цитата Сообщение от GoodWeather Посмотреть сообщение
А кстати где вы собираетесь редактировать в живую, если у вас будет отрисовка на битмап?
Есть такая необходимость.
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
21.02.2020, 16:53 14
Просто вы же говорили желательно без TRichEdit...
Ну вот я и думаю: Нарисовали вы на битмапе RTF-текст. TRichEdit у вас нету. И где ж вы будете "редактировать в живую"-то?

Добавлено через 1 минуту
Есть сторонние компоненты типа улучшенного TLabel - с поддержкой базовых HTML-тегов форматирования текста.

Добавлено через 4 минуты
Цитата Сообщение от RADStudio Посмотреть сообщение
Каким образом?
Наколеночный пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure TForm1.FormCreate(Sender: TObject);
Begin
WebBrowser1.Navigate('about:blank');
End;
 
Procedure TForm1.Button1Click(Sender: TObject);
Begin
WebBrowser1.OleObject.document.selection.createRange.pasteHTML('test<br><b><i>test</i></b><br>test<br><font size="5" color="red" face="Arial">test</font><br>test<br>');
End;
 
Procedure TForm1.Button2Click(Sender: TObject);
Begin
WebBrowser1.OleObject.document.designMode := 'on';
End;
 
Procedure TForm1.Button3Click(Sender: TObject);
Begin
If (WebBrowser1.OleObject.document.selection.type = 'Text') Then
  WebBrowser1.OleObject.document.selection.createRange.execCommand('StrikeThrough', False, EmptyParam);
End;
1
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
24.02.2020, 08:36  [ТС] 15
GoodWeather, очень интересная инфа, спасибо! Не знал, что так можно.
Но тут та же проблема, как отрисовать уже отформатированный HTML на канве (без фона, только текст)?
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
25.02.2020, 09:06  [ТС] 16
GoodWeather,
Нашел на гитхабе код отрисовки RTF, в Delphi 7 работает отлично, но в Delphi 10.3 не работает, было пару ошибок, я их исправил (видимо не правильно) и на Canvas ничего не выводит.
Знаний не хватает понять, что не так.
Прошу помощи более опытных форумчан!
1
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
25.02.2020, 13:44 17
Dll написанная в Delphi 7 не работает в Delphi 10.3
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
27.02.2020, 02:01 18
Странно, но в документации так и не смог раскопать. Пишут просто "transfer a stream of data into or out of a rich edit control".
Просто "данные". В какой кодировке - ни слова. Ну по крайней мере с ANSI оно точно работает. А только ли ANSI, есть ли возможность передавать как Юникод?

У сообщения EM_STREAMIN основные флаги: SF_RTF или SF_TEXT;
* к флагу SF_RTF можно добавлять SFF_PLAINRTF;
* к флагу SF_TEXT можно добавлять SF_UNICODE;
По идее в VCL это как-то должно затрагиваться, поищу.
Ещё интересное по теме: http://alexander-bagel.blogspo... hedit.html
Цитата Сообщение от RADStudio Посмотреть сообщение
... в RichEdit редактировать в рантайме в живую ...
Отсюда становится интересно, можно ли не создавать некую хреновину, а просто получить интерфейс ITextServices от обычного TRichEdit (а то зачем данные туда-сюда перекидывать?)...
Цитата Сообщение от RADStudio Посмотреть сообщение
Цитата Сообщение от GoodWeather Посмотреть сообщение
Вот под x64 уже даже не билдится - asm-вставки становятся не корректны.
Я под х64 собрал, все работает
Наверное вы взяли какую-то другую версию. Та что по ссылке выше - "не мочь".
Цитата Сообщение от RADStudio Посмотреть сообщение
как отрисовать уже отформатированный HTML на канве
Элементы можно. А документ... Ну если что BODY это как бы тоже элемент и содержит практически всё вроде.
Только вот насчёт "фона" не в курсе. Надо будет потестить.
0
Заблокирован
02.03.2020, 11:57 19
Цитата Сообщение от GoodWeather Посмотреть сообщение
Только вот насчёт "фона" не в курсе. Надо будет потестить.
Ну вы все даёте!
Это же элементарно. Чтобы рисовать текст без фона надо просто фон задать чистым.

...Canvas.Brush.Style:= bsClear;
0
2218 / 1146 / 418
Регистрация: 15.11.2015
Сообщений: 4,573
02.03.2020, 12:11 20
Wolwirk, неужели? И что там получилось?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2020, 12:11

Рисование на канве
У меня есть текст, затем рисую прямоугольник на канве и этот текст перекрывается прямоугольником...

Время на канве
В общем, я хотел создать прогу, которая РИСУЕТ на форме время компа. Именно через канву, потому что...

Диаграмма на канве
Написал парочку процедур по созданию диаграмм, но неправильно выводит нужные мне прямоугольники...

Графики на канве
Всем привет. Не так давно начал изучать Делфи, но вот с канвой вообще понятия не имею как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.