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

Вниз

Вывод текста в заданном прямоугольнике   Найти похожие ветки 

 
Digitman ©   (2005-06-01 13:43) [40]


> pudel   (01.06.05 13:31) [35]


> Ну И ?


что "ну И" ?

при чем здесь Label.Width/Height ?

речь идет о TFont.Height


 
pasha_golub ©   (2005-06-01 13:45) [41]

Лана. Предлагаю, чтобы было быстро искать не последовательным перебором, как советовал ЮЗ. А с помощью дихотомии, тобто метода половинного деления.

Уверен, что кол-во итераций будет меньше 10.


 
Mx ©   (2005-06-01 13:49) [42]

Я тоже что-то мало понимаю о чем вообще речь.

Объяснили же, используя DrawText с константой DT_CALCRECT можно определить требуемый прямоугольник. Значит изменяя размер и вызывая DrawText ты можешь посмотреть какой из прямоугольников вписывается в заданный. Кстати, прямоугольник будет в пикселах.


 
pudel   (2005-06-01 13:51) [43]

Задача: при каком TFont.Height Label.Width/Height равен
Rect.Left/Top/Right/Bottom


 
nikkie ©   (2005-06-01 13:53) [44]

ни при каком


 
Digitman ©   (2005-06-01 14:02) [45]


> pudel   (01.06.05 13:51) [43]


ни при каком

для получения ширины ректа нужно знать ширину "матрицы" фонт-символа

ширина же "матрицы" пропорциональна высоте, но коэф-т пропорц-ти заранее не м.б. известен, т.к. он зависит от конкр.фонта, который к тому же м.б. и TrueType.. для TrueType-фонтов "матрица" есть результат рендеринга векторного представления символа, т.е. пока рендеринг не отработает (всякие Extent-ф-ции и DrawText как раз этим и занимаются явно или неявно), узнать параметры "матрицы" попросту невозможно


 
Digitman ©   (2005-06-01 14:03) [46]

к тому же для TrueType-фонта нужно еще учитывать параметр моноширности


 
-=XP=- ©   (2005-06-01 15:01) [47]

Самое простое решение:

procedure FitText(ACanvas: TCanvas; const ARect: TRect; const AText: string);
var
 BMP: TBitmap;
 TE: TSize;
begin
 BMP := TBitmap.Create;
 try
   BMP.Canvas.Font.Assign(ACanvas.Font);
   BMP.Canvas.Font.Size := 1000;
   BMP.Canvas.Brush.Assign(ACanvas.Brush);
   TE := BMP.Canvas.TextExtent(AText);
   BMP.Width := TE.cx;
   BMP.Height := TE.cy;
   BMP.Canvas.TextOut(0, 0, AText);
   ACanvas.StretchDraw(ARect, BMP);
 finally
   BMP.Free;
 end;
end;


Но оно имеет множество недостатков. Первый - использование промежуточного растра существенно замедляет процесс прорисовки. Второй - нет эффекта Transparent, так как StretchDraw не поддерживает TransparentColor; можно изголяться и дальше, но это приведет к еще большим накладным расходам. Ну и самое главное, третье - так выводить текст - плохой тон. ;)

Наиболее совершенное решение в данном случае - получать совокупность узловых точек полигона, формирующего контур символа и трансформировать символ простым умножением на горизонтальный и вертикальный коэффициенты.

Можно еще повозиться с SetWorldTransform() - он работает с DC, поэтому и на шрифты должен оказывать требуемое воздействие.

Хотя, работа со шрифтами - весьма нелегкая задача - много подводных камней.



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

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

Наверх




Память: 0.55 MB
Время: 0.029 c
14-1117448242
Yegorchic
2005-05-30 14:17
2005.06.29
Сертификат "Лаборант-программист"


1-1118208961
Mefodiy
2005-06-08 09:36
2005.06.29
Число строк в документе Word


14-1117753713
kaif
2005-06-03 03:08
2005.06.29
Почему правильно писать "класс" и неправильно писать "аддресс"?


1-1117780243
Woprosnik
2005-06-03 10:30
2005.06.29
Динамическое меню


1-1118120445
drAndrey
2005-06-07 09:00
2005.06.29
TreeView и ToolTips