Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизВывод текста в заданном прямоугольнике Найти похожие ветки
← →
pudel (2005-06-01 11:23) [0]Всем привет! Собственно вопрос в теме. Как это сделать?
← →
pasha_golub © (2005-06-01 11:28) [1]DrawText + F1
← →
Digitman © (2005-06-01 11:28) [2])
Label.Caption := "Текст";
← →
pasha_golub © (2005-06-01 11:30) [3]Digitman © (01.06.05 11:28) [2]
Мощно. :0)
← →
Digitman © (2005-06-01 11:33) [4]
> pasha_golub © (01.06.05 11:30) [3]
> Мощно. :0)
а чего выёживаться зазря ?)
прямоугольник он и в африке прямоугольник)
чем TLabel хуже прямоугольника ?) ...самое то !)
← →
pudel (2005-06-01 11:39) [5]Для юмористов уточню: размер шрифта должен подбираться автоматически.
← →
Думкин © (2005-06-01 11:41) [6]> [5] pudel (01.06.05 11:39)
Почитай: http://www.delphimaster.ru/articles/stringgrid/index.html
← →
Mx © (2005-06-01 11:41) [7]см. [1] и используй там константу DT_CALCRECT
← →
pasha_golub © (2005-06-01 11:53) [8]pudel (01.06.05 11:39) [5]
А кофе он должен уметь варить? ;0)
← →
pudel (2005-06-01 11:56) [9]Прочитал статью.
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_WORDBREAK); - работает
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT); - полная тишина. Я что-то пропустил в статье?
← →
Думкин © (2005-06-01 12:00) [10]> [9] pudel (01.06.05 11:56)
Да ничего - просто все и своидится к
"При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справке обратить внимание на константу DT_CALCRECT."
Что и говорилось тут неоднократно. Флаги можно выставлять не только по одному.
← →
pasha_golub © (2005-06-01 12:03) [11]pudel (01.06.05 11:56) [9]
Угу, пропустил.
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT);
Расчитывает и устанавливает необходимые(!) размеры прямоугольника при заданных характеристиках шрифта. И вызывать в твоем случае нужно вот так:
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT OR DT_WORDBREAK);
Ну и собсно, цитата из хелпа:
DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawText uses the width of the rectangle pointed to by the lpRect parameter and extends the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText modifies the right side of the rectangle so that it bounds the last character in the line. In either case, DrawText returns the height of the formatted text but does not draw the text.
← →
pudel (2005-06-01 12:11) [12]DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT OR DT_WORDBREAK); - не работает.
← →
Думкин © (2005-06-01 12:13) [13]> [12] pudel (01.06.05 12:11)
? Чтио именно не работает. Код давай.
← →
pasha_golub © (2005-06-01 12:15) [14]pudel (01.06.05 12:11) [12]
При вызове с параметром DT_CALCRECT оно не будет рисовать! В справке ж английским по белому написано.
← →
pudel (2005-06-01 12:17) [15]procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string;
begin
s := "Hello world! Hello world! Hello world! Hello world!";
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect,DT_WORDBREAK);
end;
Смотри: http://www.delphimaster.ru/articles/stringgrid/index.html
Уточню ещё раз: мне нужно вписать текств заданныйпрямоугольник. Т. е. подобрать характеристики шпифта.
← →
pudel (2005-06-01 12:19) [16]Сорри ...
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string;
begin
s := "Hello world! Hello world! Hello world! Hello world!";
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect,DT_CALCRECT OR DT_WORDBREAK);
end;
← →
Юрий Зотов © (2005-06-01 12:19) [17]> pasha_golub © (01.06.05 12:15) [14]
Это ж надо открыть справку... потом читать... потом переводить... мороки-то сколько...
Ты, Паш, не умничай, ты код давай!
← →
Юрий Зотов © (2005-06-01 12:30) [18]> pudel (01.06.05 12:19) [16]
Скажите, сколько времени нужно, чтобы додуматься, например, вот до такого алгоритма:
1. Вызываем DrawText с DT_CALCRECT OR DT_WORDBREAK - получаем минимальную высоту прямоугольника, в котором может уместиться текст.
2. Если эта высота не больше высоты ячейки - goto 5.
3. Уменьшаем размер шрифта на единицу. Если получился ноль - значит, текст слишком длиный и не может быть вписан в ячейку никаким шрифтом. Goto 6.
4. Goto 1.
5. Рисуем текст (вызываем DrawText уже без DT_CALCRECT).
6. Выход.
================================
Так сколько же нужно времени, чтобы додуматься до такого простенького алгоритма?
← →
Digitman © (2005-06-01 12:34) [19]
> pudel (01.06.05 11:39) [5]
а GetTextExtentPoint не спасет отца русской демократии ?
разбиваешь свою строку на подстроки (сам делаешь wrap)
для каждой подстроки, перебирая и устанавливая по убыванию размеры тек.фонта, получаешь ширину и высоту, "суммируешь" полученные rect"ы, сравниваешь "сумму" с заданным rect"ом, при первом же непревышении - брейк)
← →
Mx © (2005-06-01 12:40) [20]Кстати, не какая-то из этих функций неверно расчитывает прямоугольник для наклонного шрифта. Когда писал компонент а-ля Excel.Worksheet приходилось добавлять угол.
← →
Mx © (2005-06-01 12:41) [21]Oops, "не" после запятой НЕ читать
← →
Digitman © (2005-06-01 12:42) [22]
> Юрий Зотов © (01.06.05 12:30) [18]
автор самому себе противоречит.
у него есть заданный фонт с заданным размером, есть заданный рект (т.е. менять ни фонт, ни его размер, ни рект якобы нельзя по условиям, иначе в условия было бы отражено обратное), и он пытается что-то куда-то "вписать" при этих условиях !
это типа у меня есть гаечный ключ на 24 и есть кольцо 20 мм в диаметре, как бы мне просунуть ключ в кольцо ? есть и другие ключи, есть и другие кольца, но мне нужно именно ЭТОТ ключ в ЭТО кольцо просунуть)
и после этого мы тут юмористами оказываемся)
← →
pudel (2005-06-01 12:45) [23]Чтобы найти квадратный корень из 4 можно сделать 1+1 потом 2+2. Но увы, хочется, как-то попроще и побыстрее. А то у отца русской демократии очень много прямоугольников и они очень часто меняют размеры. Боюсь перебор не потянет.
← →
pudel (2005-06-01 12:48) [24]Ещё раз уточняю. Фонт не задан(об этом речи не было). Задан Рект.
← →
Mx © (2005-06-01 12:49) [25]
> Digitman © (01.06.05 12:42) [22]
> это типа у меня есть гаечный ключ на 24 и есть кольцо 20
> мм в диаметре, как бы мне просунуть ключ в кольцо ? есть
> и другие ключи, есть и другие кольца, но мне нужно именно
> ЭТОТ ключ в ЭТО кольцо просунуть)
Как показала соседняя ветка примерно так организован BMM :)
← →
Думкин © (2005-06-01 12:52) [26]> [24] pudel (01.06.05 12:48)
А ты не бойся - ты попробуй. Чай не набаках расчеты ведуться. Вот у меня все тянуло, а у тебя не потянет. Странно.
← →
Думкин © (2005-06-01 12:52) [27]на абаках
← →
Mx © (2005-06-01 12:53) [28]
> pudel (01.06.05 12:48) [24]
> Фонт не задан(об этом речи не было).
Блин не фига себе. Тады можно перебрать несколько размеров шрифтов и посмотреть вписывается прямоугольник или нет.
Щас посмотрел, наклонный шрифт DrawText неверно расчитывает. Да и TextExtent вроде тоже.
← →
Думкин © (2005-06-01 12:53) [29]ведутся
совсем устал. :(
← →
Digitman © (2005-06-01 12:54) [30]
> pudel (01.06.05 12:48) [24]
тогда ты чужой огород ринулся вскапывать, с DrawText(DT_CALCRECT)..
ты же вновь сам себе противоречишь !
по условию рект задан на перед, но при этом тебя устраивает(цитата из справки)
"..extends the base of the rectangle to bound the last line of text"
> Фонт не задан
придется задать !
и вычислить, какой из них и с какими атрибутами подойдет, можно только перебором
← →
pudel (2005-06-01 13:02) [31]Фраза "При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справке обратить внимание на константу DT_CALCRECT." смутила. Понятия не имею, зачем посоветовали DrawText(DT_CALCRECT).
Неужели нельзя расчитать размер Фонта в пикселях, а не в каких-то Сайзах.
← →
nikkie © (2005-06-01 13:05) [32]пеши исчо.
извините, не удержался.
← →
Digitman © (2005-06-01 13:11) [33]
> Понятия не имею, зачем посоветовали 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
← →
Digitman © (2005-06-01 13:15) [34]т.е. размер фонта в пойнтах м.б. расчитан на основании высоты в пикселах и коэф-та конверсии (пиксел на дюйм)
← →
pudel (2005-06-01 13:31) [35]TCanvas.TextExtent как и другии это рассчёты перебором. Г-н Думкин уже давно устал так считать. Для
Label1.Caption := "Label1" Label1.Width := 32 Label1.Height := 13
Label1.Font.Size := 8. Ну И ?
← →
Думкин © (2005-06-01 13:33) [36]> [35] pudel (01.06.05 13:31)
Я устал так считать? На абаке? О чем речь?
← →
pudel (2005-06-01 13:37) [37]Да да. Про абак.
← →
Думкин © (2005-06-01 13:38) [38]> [37] pudel (01.06.05 13:37)
Ты попробовал? Тормозит? Попробуй все-таки.
А устал я - потому что сплю мало. :))
← →
pudel (2005-06-01 13:42) [39]7 лет назад пробовал. Не хочу наступать на тежи грабли. Тогда же пытался понть, что можно сделать с Font.Size = -Font.Height * 72 / Font.PixelsPerInch.
← →
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.58 MB
Время: 0.052 c