![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывод текста в заданном прямоугольнике [D7, Win2k]
pudel © (2005-06-01 11:23:00)Всем привет! Собственно вопрос в теме. Как это сделать?
-=XP=- (2005-06-01 15:01:00) [1]Самое простое решение:
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, поэтому и на шрифты должен оказывать требуемое воздействие.
Хотя, работа со шрифтами - весьма нелегкая задача - много подводных камней.
Digitman (2005-06-01 14:03:00) [2]к тому же для TrueType-фонта нужно еще учитывать параметр моноширности
Digitman (2005-06-01 14:02:00) [3]
> pudel (01.06.05 13:51) [43]
ни при каком
для получения ширины ректа нужно знать ширину "матрицы" фонт-символа
ширина же "матрицы" пропорциональна высоте, но коэф-т пропорц-ти заранее не м.б. известен, т.к. он зависит от конкр.фонта, который к тому же м.б. и TrueType.. для TrueType-фонтов "матрица" есть результат рендеринга векторного представления символа, т.е. пока рендеринг не отработает (всякие Extent-ф-ции и DrawText как раз этим и занимаются явно или неявно), узнать параметры "матрицы" попросту невозможно
nikkie (2005-06-01 13:53:00) [4]ни при каком
pudel (2005-06-01 13:51:00) [5]Задача: при каком TFont.Height Label.Width/Height равен
Rect.Left/Top/Right/Bottom
Mx (2005-06-01 13:49:00) [6]Я тоже что-то мало понимаю о чем вообще речь.
Объяснили же, используя DrawText с константой DT_CALCRECT можно определить требуемый прямоугольник. Значит изменяя размер и вызывая DrawText ты можешь посмотреть какой из прямоугольников вписывается в заданный. Кстати, прямоугольник будет в пикселах.
pasha_golub (2005-06-01 13:45:00) [7]Лана. Предлагаю, чтобы было быстро искать не последовательным перебором, как советовал ЮЗ. А с помощью дихотомии, тобто метода половинного деления.
Уверен, что кол-во итераций будет меньше 10.
Digitman (2005-06-01 13:43:00) [8]
> pudel (01.06.05 13:31) [35]
> Ну И ?
что "ну И" ?
при чем здесь Label.Width/Height ?
речь идет о TFont.Height
pudel (2005-06-01 13:42:00) [9]7 лет назад пробовал. Не хочу наступать на тежи грабли. Тогда же пытался понть, что можно сделать с Font.Size = -Font.Height * 72 / Font.PixelsPerInch.
Думкин (2005-06-01 13:38:00) [10]> [37] pudel (01.06.05 13:37)
Ты попробовал? Тормозит? Попробуй все-таки.
А устал я - потому что сплю мало. :))
pudel (2005-06-01 13:37:00) [11]Да да. Про абак.
Думкин (2005-06-01 13:33:00) [12]> [35] pudel (01.06.05 13:31)
Я устал так считать? На абаке? О чем речь?
pudel (2005-06-01 13:31:00) [13]TCanvas.TextExtent как и другии это рассчёты перебором. Г-н Думкин уже давно устал так считать. Для
Label1.Caption := 'Label1' Label1.Width := 32 Label1.Height := 13
Label1.Font.Size := 8. Ну И ?
Digitman (2005-06-01 13:15:00) [14]т.е. размер фонта в пойнтах м.б. расчитан на основании высоты в пикселах и коэф-та конверсии (пиксел на дюйм)
Digitman (2005-06-01 13:11:00) [15]
> Понятия не имею, зачем посоветовали DrawText(DT_CALCRECT).
а я понятия не имею, почему ты порочитав статью не сравнил то о чем в ней идет речь с тем что требуется именно тебе ..
> Неужели нельзя расчитать размер Фонта в пикселях, а не в
> каких-то Сайзах
размер фонта не задается ни в пикселях ни к каких-то там непонятным "сайзах", задается он в "пойнтах"
при этом (цитата)
To determine the size of the font in pixels, use the Height property instead. The value of Size can be obtained from the height in pixels using this formula:
Font.Size = -Font.Height * 72 / Font.PixelsPerInch
и есть готовый метод, кстати
TCanvas.TextExtent
nikkie (2005-06-01 13:05:00) [16]пеши исчо.
извините, не удержался.
pudel (2005-06-01 13:02:00) [17]Фраза "При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справке обратить внимание на константу DT_CALCRECT." смутила. Понятия не имею, зачем посоветовали DrawText(DT_CALCRECT).
Неужели нельзя расчитать размер Фонта в пикселях, а не в каких-то Сайзах.
Digitman (2005-06-01 12:54:00) [18]
> pudel (01.06.05 12:48) [24]
тогда ты чужой огород ринулся вскапывать, с DrawText(DT_CALCRECT)..
ты же вновь сам себе противоречишь !
по условию рект задан на перед, но при этом тебя устраивает(цитата из справки)
"..extends the base of the rectangle to bound the last line of text"
> Фонт не задан
придется задать !
и вычислить, какой из них и с какими атрибутами подойдет, можно только перебором
Думкин (2005-06-01 12:53:00) [19]ведутся
совсем устал. :(
Mx (2005-06-01 12:53:00) [20]
> pudel (01.06.05 12:48) [24]
> Фонт не задан(об этом речи не было).
Блин не фига себе. Тады можно перебрать несколько размеров шрифтов и посмотреть вписывается прямоугольник или нет.
Щас посмотрел, наклонный шрифт DrawText неверно расчитывает. Да и TextExtent вроде тоже.