Главная страница
    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.011 c
14-1133995568
Кефир87
2005-12-08 01:46
2006.01.01
На какой частоте рамблер тв в ЮЗАО (Москва)


2-1134641543
Kotyra
2005-12-15 13:12
2006.01.01
Создания архива


1-1133789961
Экспериментатор
2005-12-05 16:39
2006.01.01
Как в MDI приложении сделать чтобы MDI-child окно максимизировало


11-1116038421
uli
2005-05-14 06:40
2006.01.01
разрешение экрана


1-1133517137
Oleg_358367
2005-12-02 12:52
2006.01.01
скорость for и while





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский