Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывод текста в заданном прямоугольнике [D7, Win2k]


Страницы:   1 2 3

pudel ©   (2005-06-01 11:23:00) 

Всем привет! Собственно вопрос в теме. Как это сделать?


Думкин   (2005-06-01 12:52:00) [21]

на абаках


Думкин   (2005-06-01 12:52:00) [22]

> [24] pudel   (01.06.05 12:48)

А ты не бойся - ты попробуй. Чай не набаках расчеты ведуться. Вот у меня все тянуло, а у тебя не потянет. Странно.


Mx   (2005-06-01 12:49:00) [23]


> Digitman ©   (01.06.05 12:42) [22]
> это типа у меня есть гаечный ключ на 24 и есть кольцо 20
> мм в диаметре, как бы мне просунуть ключ в кольцо ? есть
> и другие ключи, есть и другие кольца, но мне нужно именно
> ЭТОТ ключ в ЭТО кольцо просунуть)

Как показала соседняя ветка примерно так организован BMM :)


pudel   (2005-06-01 12:48:00) [24]

Ещё раз уточняю. Фонт не задан(об этом речи не было). Задан Рект.


pudel   (2005-06-01 12:45:00) [25]

Чтобы найти квадратный корень из 4 можно сделать 1+1 потом 2+2. Но увы, хочется, как-то попроще и побыстрее. А то у отца русской демократии очень много прямоугольников и они очень часто меняют размеры. Боюсь перебор не потянет.


Digitman   (2005-06-01 12:42:00) [26]


> Юрий Зотов ©   (01.06.05 12:30) [18]


автор самому себе противоречит.

у него есть заданный фонт с заданным размером, есть заданный рект (т.е. менять ни фонт, ни его размер, ни рект якобы нельзя по условиям, иначе в условия было бы отражено обратное), и он пытается что-то куда-то "вписать" при этих условиях !

это типа у меня есть гаечный ключ на 24 и есть кольцо 20 мм в диаметре, как бы мне просунуть ключ в кольцо ? есть и другие ключи, есть и другие кольца, но мне нужно именно ЭТОТ ключ в ЭТО кольцо просунуть)

и после этого мы тут юмористами оказываемся)


Mx   (2005-06-01 12:41:00) [27]

Oops, "не" после запятой НЕ читать


Mx   (2005-06-01 12:40:00) [28]

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


Digitman   (2005-06-01 12:34:00) [29]


> pudel   (01.06.05 11:39) [5]


а GetTextExtentPoint не спасет отца русской демократии ?

разбиваешь свою строку на подстроки (сам делаешь wrap)
для каждой подстроки, перебирая и устанавливая по убыванию размеры тек.фонта, получаешь ширину и высоту, "суммируешь" полученные rect'ы, сравниваешь "сумму" с заданным rect'ом, при первом же непревышении - брейк)


Юрий Зотов   (2005-06-01 12:30:00) [30]

> 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. Выход.

================================

Так сколько же нужно времени, чтобы додуматься до такого простенького алгоритма?


Юрий Зотов   (2005-06-01 12:19:00) [31]

> pasha_golub ©   (01.06.05 12:15) [14]

Это ж надо открыть справку... потом читать... потом переводить... мороки-то сколько...

Ты, Паш, не умничай, ты код давай!


pudel   (2005-06-01 12:19:00) [32]

Сорри ...
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;


pudel   (2005-06-01 12:17:00) [33]

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

Уточню ещё раз: мне нужно вписать текств заданный прямоугольник. Т. е. подобрать характеристики шпифта.


pasha_golub   (2005-06-01 12:15:00) [34]

pudel   (01.06.05 12:11) [12]
При вызове с параметром DT_CALCRECT оно не будет рисовать! В справке ж английским по белому написано.


Думкин   (2005-06-01 12:13:00) [35]

> [12] pudel   (01.06.05 12:11)

? Чтио именно не работает. Код давай.


pudel   (2005-06-01 12:11:00) [36]

DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT OR DT_WORDBREAK); - не работает.


pasha_golub   (2005-06-01 12:03:00) [37]

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.


Думкин   (2005-06-01 12:00:00) [38]

> [9] pudel   (01.06.05 11:56)

Да ничего - просто все и своидится к

"При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справкеобратить внимание на константу DT_CALCRECT."

Что и говорилось тут неоднократно. Флаги можно выставлять не только по одному.


pudel   (2005-06-01 11:56:00) [39]

Прочитал статью.
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_WORDBREAK); - работает
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT); - полная тишина. Я что-то пропустил в статье?


pasha_golub   (2005-06-01 11:53:00) [40]

pudel   (01.06.05 11:39) [5]
А кофе он должен уметь варить? ;0)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо