Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Работа с TCanvas   Найти похожие ветки 

 
SamProf ©   (2005-12-01 23:58) [0]

Мастера, у меня есть Rect некоторой области куда нужно намалювать текст на канве.
Мне нужно вписать эго в этот rect по вертикали и горизонтали.
Т.е. мне нужно узнать такой size фонта, чтобы длина этого текста была не больше, чем rect.right-rect.left, а высота не больше, чем rect.bottom-rect.top.
А потом ещё можно, чтобы при выводе, этот текст не затирал белым всю область на которой этот текст малюется, т.е. примерно, как установить св-во transperent?
Спасибо!


 
stef ©   (2005-12-02 01:28) [1]

я бы делал так. изобразил бы этот текст на другой канве, а затем используя блиттинг или тот же copyrect наложил бы второй на первый предварительно масштабируя его под нужные размеры. Хороший город Севастополь - завидую тебе.


 
ЮЮ ©   (2005-12-02 03:06) [2]

Задаешь ширину, вызываешь DrawText с нужными аргументами + DT_CALCRECT. Смотришь вычисленные высоту и ширину. Если больше заданной, уменьшаешб размер фонта и повторяешь.


 
SamProf ©   (2005-12-03 11:53) [3]

Я сделал вот так вот:

procedure texttorect(c:TCanvas;r:TRect;s:string;dx,dy:Integer);
var
  h1:Integer;
  sx,sy:Integer;
begin

      c.Font.Height:=(r.Bottom-r.Top)-2*dy;

      h1:=abs(c.Font.Size);

      inc(h1);
      repeat
            dec(h1);
            C.Font.Height:=h1;
      until ((C.TextWidth(s)<(r.Right-r.Left)-2*dx)and(c.TextHeight(s)<(r.Bottom-r.Top)-2*dy))or(h1=0);
      if h1<>0 then
         begin
         sx:=c.TextWidth(s);
         sx:=r.Left+(r.Right-r.Left-sx) div 2;
         sy:=c.TextHeight(s);
         sy:=r.Top+(r.Bottom-r.Top-sy) div 2;
         C.TextOut(sx,sy,s);
         end;

end;



Но данная процедура работает достаточно медленно  при большой высоте и небольшой ширине.


> Хороший город Севастополь - завидую тебе.

Хорошо там, где нас нет!


 
Наиль ©   (2005-12-03 14:07) [4]

1. Лучше оценить во сколько раз текст выше и шире прямоугольника, а потом разделить размер шрифта на большую из величин.
2. Brush.Style:=bsClear - уберёт фон под текстом
3. В приведёном примере это не существенно, а вообще не стоит вычислять высоту и ширину прямоугольника так часто.


 
Наиль ©   (2005-12-03 14:07) [5]

1. Лучше оценить во сколько раз текст выше и шире прямоугольника, а потом разделить размер шрифта на большую из величин.
2. Brush.Style:=bsClear - уберёт фон под текстом
3. В приведёном примере это не существенно, а вообще не стоит вычислять высоту и ширину прямоугольника так часто.



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1134821379
чайник9
2005-12-17 15:09
2006.01.01
Форма


14-1134112577
begin...end
2005-12-09 10:16
2006.01.01
С Днём рождения! 9 декабря


8-1122266318
Sankez
2005-07-25 08:38
2006.01.01
Как можно проиграть avi на рабочем столе ?


14-1134222393
Pazitron_Brain
2005-12-10 16:46
2006.01.01
Помогите


14-1133954121
Антоний
2005-12-07 14:15
2006.01.01
Печать на CD