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

Вниз

Вывод текста на канву с масштабированием   Найти похожие ветки 

 
wsih ©   (2006-05-24 11:55) [0]

Здраствуйте!
Есть канва, на которую нужно вывести строки, ограниченные прямоугольными областями разного размера (высоты в основном ) ). Не могу добится масштабирования текста по размерам заданной области. Не имеет значения, будет ли текст во всех областях одинаковой величины, важно что бы он отобразился весь в рамках заданной области. Естесственно в несколько строк.
Подскажите алгоритм или направление раскопок. Спасибо ).


 
MBo ©   (2006-05-24 11:58) [1]

API-функция DrawText
при необходимости расчета - с флагом DT_CALCRECT


 
wsih ©   (2006-05-24 12:01) [2]

DrawText неподходит... Нужно какое то комплексное решение. На это есть 2 причины: прямоугольные области _строго_ фиксированы; текста может быть много, возможно до минимального размера шрифта, что бы поместился весь.


 
MBo ©   (2006-05-24 12:09) [3]

В GDI нет функций для подгонки размеров шрифта под нужную область. Единственный способ - самому менять размер шрифта, и измерять.


 
wsih ©   (2006-05-24 12:16) [4]

Вот я и ищу умных мыслей по этому поводу... свои все - закончились (. (да их и не много было)...
+ не получается менять размер шрифта с помошью:
logfont.lfHeight
canvas.Font.Handle:=CreateFontIndirect(Logfont)
DrawText - это успешно игнорирует, равно как и просто Canvas.Font.Size;
Конструкция с CreateFontIndirect меняет размер шрифта только при Canvas.TextOut


 
MBo ©   (2006-05-24 12:40) [5]

Уж не знаю, кто там у тебя чего игнорирует, но вот примитивная подгонка:

function CalcFontSize(ACanvas: TCanvas; Text: string; ARect: TRect; AFont:
 TFont; DTFlags: Integer): Integer;
var
 i: Integer;
 R: TRect;
 W, H: Integer;
 Temp: TFont;
begin
 i := 37;
 W := ARect.Right - ARect.Left;
 H := ARect.Bottom - ARect.Top;
 Temp := ACanvas.Font;
 ACanvas.Font := AFont;
 repeat
   Dec(i);
   ACanvas.Font.Size := i;
   R := ARect;
   DrawText(ACanvas.Handle, PChar(Text), Length(Text), R, DT_CALCRECT or
     DTFLags);
 until (i = 8) or ((R.Right - R.Left <= W) and (R.Bottom - R.Top <= H));
 ACanvas.Font := Temp;
 Result := i;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 RR: TRect;
 s: string;
 sz: Integer;
begin
 RR := Rect(10, 10, 300, 80);
 s :=     "Однажды в студеную зимнюю пору я из лесу вышел, был сильный мороз";
 sz := CalcFontSize(Canvas, s, RR, Canvas.Font, DT_CENTER or DT_VCENTER or
   DT_WORDBREAK);
 Canvas.Font.Size := sz;
 Canvas.Rectangle(RR);
 Canvas.Brush.Style := bsClear;
 DrawText(Canvas.Handle, PChar(s), Length(s), RR, DT_CENTER or DT_VCENTER or
   DT_WORDBREAK);
end;


 
ЮЮ ©   (2006-05-24 12:48) [6]


> DrawText - это успешно игнорирует, равно как и просто Canvas.
> Font.Size;


Для этого стоит использовать шрифт, для которого определен размер 1, Arial, например. А вот MS Serif, действительно, "игнорирует". Для этого необязательно терзать Canvas, попробуй просто в редакторе объектов поставить Font.Size = 1


 
webpauk   (2006-05-24 14:16) [7]

а как насчет загнать весть текст в Tbitmap, а Bitmap уже масштабировать (например загнать в Timage у которого есть свойство Stretch)


 
wsih ©   (2006-05-25 21:12) [8]

MBo - одна голова - хорошо, а форум - лучше.
Спасибо за процедуру.



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

Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
2-1150726094
evgenij_
2006-06-19 18:08
2006.07.09
QReport


3-1147266021
Morrison
2006-05-10 17:00
2006.07.09
Index is read-only. Что делать?


2-1150452726
NSA
2006-06-16 14:12
2006.07.09
Как узнать колличество дней в месяце?


15-1150191747
vajo
2006-06-13 13:42
2006.07.09
Текст в диплом участникам соревнований


6-1141464906
MegaWolf510
2006-03-04 12:35
2006.07.09
Проблема с отправкой смс сообщений через com. Помогите, плиз...





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