Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизВывод текста в заданном прямоугольнике Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.042 c