Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.06.2011, 18:37
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
Счастье Вывод текста и HTML-кода на Canvas

Доброго времени суток!

1. Каким образом можно нарисовать (вывести) текст на Canvas с переносом строки, т.е. определенной ширины (подобно WordWrap в Label), и узнать его высоту в пикселах?

2. Как вывести текст на Canvas, исходя из HTML-кода, т.е. применяя теги: <b>, <font>, <i>, <quote> и т.д.?

3. Совместить 1-ый и 2-ой пункты???

Если можно исходники киньте, или помогите разобраться. Заранее спасибо!
Ответить с цитированием
  #2  
Старый 13.06.2011, 19:45
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Код:
var
  S: String;
  R: TRect;
  H: Integer;

H := DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_NOCLIP);
ShowMessage('Высота текста = ' + IntToStr(H));
Ответить с цитированием
  #3  
Старый 14.06.2011, 09:30
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1.
Код:
type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);

procedure TForm1.FormPaint(Sender: TObject);
var
  s: String;
  rct: TRect;
  w, h: Integer;
begin
  w:=100; // исходная ширина прямоугольника с текстом
  h:=0; // высота не нужна пока
  s:='Каким образом можно нарисовать (вывести) текст на Canvas с переносом строки, т.е. определенной ширины (подобно WordWrap в Label), и узнать его высоту в пикселах?';
  rct.Left:=100; // коорд. X для вывода прямоугольника с текстом
  rct.Top:=100; // коорд. Y для вывода прямоугольника с текстом
  rct.Right:=rct.Left+w;
  rct.Bottom:=rct.Top+h;
  // вычислим размеры прямоугольника
  DrawText(Canvas.Handle, PChar(s), -1, rct, DT_CALCRECT or DT_WORDBREAK);
  // нарисуем текст
  DrawText(Canvas.Handle, PChar(s), -1, rct, DT_WORDBREAK);
end;

2. парсить текст и применять Canvas.Font.Style:=[fsBold, fsItalic];

3. 1+2
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 14.06.2011 в 09:32.
Ответить с цитированием
  #4  
Старый 14.06.2011, 09:51
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

ryderx34 и NumLock, спасибо очень помогли.
Ответить с цитированием
  #5  
Старый 14.06.2011, 10:52
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

A если все ручками сделать то как-то так получится...
Код:
Function WordWrapTextToCanvas(aCanvas:TCanvas; aText:String; X,Y,RigthBord:Integer; LS:Real):boolean;
var
  i,W,W1,Spc,XX:Integer;
  S:String;
  aT:array of String;
begin
W:=aCanvas.TextWidth(aText);
Spc:=aCanvas.TextWidth(' ');
XX:=X;
W1:=0;
S:='';
aText:=aText+' ';
if W>RigthBord then
  begin
    for i:=1 to Length(aText) do
      begin
        if aText[i]<>' ' then
          S:=S+aText[i]
        else begin
          SetLength(aT,Length(aT)+1);
          aT[Length(aT)-1]:=S;
          S:='';
        end;
      end;
    for i:=0 to Length(aT)-1 do
      begin
        W1:=W1+aCanvas.TextWidth(aT[i]);
        if W1>RigthBord then
          begin
            Y:=Round(Y+(aCanvas.TextHeight(aT[i])*LS));
            X:=XX;
            W1:=0;
          end;
        aCanvas.textOut(X,Y,aT[i]);
        X:=X+Spc+aCanvas.TextWidth(aT[i]);
      end;
    Result:=true;
  end else aCanvas.TextWidth(aText);
end;
Использовать так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
  X,Y,L: Integer;
begin
Image1.Width:=583;
Image1.Canvas.Font.Size:=14;
X:=20;
L:=Image1.Width-60;
Y:=20;
S:='Это очень длинная строка, возможно самая длинная, которую когда либо писали в Delphi';

WordWrapTextToCanvas(Image1.Canvas,S,X,Y,L,1.1); //Отрисовка текста
end;
Параметры:
aCanvas = Канва на которую выносим текст
aText = Текст
X = Отступ от левой границы канвы
Y = Отступ от верхней границы канвы
RigthBord = Отступ от правой границы канвы
LS = Межстрочный интервал

Последний раз редактировалось Janom, 14.06.2011 в 10:54.
Ответить с цитированием
  #6  
Старый 29.06.2011, 01:17
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Спасибо. Тема закрыта.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter