Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.026 c
2-1134552643
Romiros
2005-12-14 12:30
2006.01.01
Знаки после запятой!


14-1133895872
Дмитрий_05
2005-12-06 22:04
2006.01.01
Подключить два компъютера к интернету


2-1134689494
Змей
2005-12-16 02:31
2006.01.01
не активная кнопка "Свернуть"


14-1133852863
Тульский
2005-12-06 10:07
2006.01.01
Сжималки траффика


8-1121692230
BFG9k
2005-07-18 17:10
2006.01.01
FastLib





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский