![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DrawText
RealRascal © (2004-06-15 19:04:00)Хочу использовать DrawText чтобы он мне сделал перенос по словам. Для этого объявляю строку как PChar, задаю границы с помощью Rect1:TRect, и среди прочих флагов указываю DT_MODIFYSTRING.
При таком использовании получаю AV в ntdll.dll(лежит в windows\system).
Если же убрать флаг DT_MODIFYSTRING, то ошибки нет(и сама функция срабатывает правильно, возвращает высоту текста), но и цель не достигается.
var
rect1 : Trect;
begin
s := pchar('Test Test Test Test Test Test');
rect1.Bottom := 50;
rect1.Right := 50;
rect1.Left := 0;
rect1.Top := 0;
//в следующей строке возникает AV
DrawText(
form1.Canvas.Handle,
s,
length(s),
Rect1,
DT_VCENTER or
DT_CENTER or
DT_NOPREFIX or
DT_CALCRECT or
DT_WORDBREAK
or DT_MODIFYSTRING если это убрать, то AV не возникает
...
);
Вот что сказано про этот флаг в хелпе
Modifies the given string to match the displayed text. This flag has no effect unless the DT_END_ELLIPSIS or DT_PATH_ELLIPSIS flag is specified.
А вот что они пишут про DT_END_ELLIPSIS or DT_PATH_ELLIPSIS:
Replaces part of the given string with ellipses, if necessary, so that the result fits in the specified rectangle. The given string is not modified unless the DT_MODIFYSTRING flag is specified.
Последнее мне не понятно. Чем там заменяется часть строки? Эллипсами? Чушь какая-то, либо у меня с англиЦким не лады...Но вопрос не об этом. Как мне перенос по словам сделать с помощью subj? Вручную лопатить неохота...
RealRascal (2004-06-16 06:52:00) [1]UP
RealRascal (2004-06-15 20:52:00) [2]Я то думал, что DrawText это делает, если ему указать флаг DT_MODIFYSTRING... Надо только его вызвать привильно...
RealRascal (2004-06-15 20:36:00) [3]И вот еще что примечательно, AV возникает, на там говорится не про project1, а про NTdll.dll!
panov (2004-06-15 20:33:00) [4]Расставлять переносы придется вручную. Есть несколько способов.
Вот пара из них:
1.
- вычисляем приблизительную длину строки, которая может войти без переносов в ширину Rect (Например,Canvas.TextWidth)
- пользуемся некой функцией расстановки переносов (например, стандартной WrapText), уменьшая правую границу на 1-2 символа.
- в результате получаем строку с разделителями, которую затем обрабатываем для вывода построчно.
2.
- Если в строке символы должны выводиться разными стилями, то пробегаем в цикле по строке, вычисляя ширину каждого символа пикселях.
- Как только сумма Width символов превысит ширину Rect, обрезаем по послежднему слову, которое вместилось целиком.
- далее выводим строку на канву.
panov (2004-06-15 20:03:00) [5]>RealRascal © (15.06.04 19:56) [5]
Вы наверно неправильно меня поняли. Мне НЕ нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
А вот это уже значительно сложнее-)
RealRascal (2004-06-15 19:56:00) [6]
>
> > [1] panov © (15.06.04 19:05)
>
> Вы наверно неправильно меня поняли. Мне нужно выводить строку
> на канвас, мне надо, чтобы сама строка изменилась с учетом
> ширины Rect1 и переносом по словам. Проще говоря, требуется
> чтобы сабж расставил, где надо, #13#10.
Тьфу, извиняюсь, пропустил НЕ
Вы наверно неправильно меня поняли. Мне НЕ нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
panov (2004-06-15 19:37:00) [7]1.
DT_WORDBREAK: Перенос по словам и символам перевода строки+возврат каретки.
DT_CALCRECT: Расчет необходимой области(TRect) для перенесенной строки(Rect1);
2. Вывод строки с переносами в прямоугольную область Rect1(вычисленную на предыдущем шаге)
RealRascal (2004-06-15 19:17:00) [8]
> [1] panov © (15.06.04 19:05)
Вы наверно неправильно меня поняли. Мне нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
RealRascal (2004-06-15 19:10:00) [9]не совсем понял... щас попробую сначало одно, потом другое, потом оба вместе.
panov (2004-06-15 19:05:00) [10]1. DrawTExt(...,Rect1, DT_WORDBREAK+DT_CALCRECT)
2. DrawTExt(...,Rect1, DT_WORDBREAK);