Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1117954988
lookin
2005-06-05 11:03
2005.06.29
Вот людям делать нечего...


1-1118174495
Scorp123
2005-06-08 00:01
2005.06.29
Не работает функция Time


1-1117777385
msgipss
2005-06-03 09:43
2005.06.29
Как обработать исключение сгенерированное в чужом объекте


3-1116307822
kyn66
2005-05-17 09:30
2005.06.29
Как удалить ключевой столбец из таблицы Access ?


6-1111118939
TankMan
2005-03-18 07:08
2005.06.29
Хотелось бы узнать алгоритм поиска компьютеров в сети...





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