Текущий архив: 2004.07.04;
Скачать: CL | DM;
Вниз
DrawText Найти похожие ветки
← →
RealRascal © (2004-06-15 19:04) [0]Хочу использовать 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? Вручную лопатить неохота...
← →
panov © (2004-06-15 19:05) [1]1. DrawTExt(...,Rect1, DT_WORDBREAK+DT_CALCRECT)
2. DrawTExt(...,Rect1, DT_WORDBREAK);
← →
RealRascal © (2004-06-15 19:10) [2]не совсем понял... щас попробую сначало одно, потом другое, потом оба вместе.
← →
RealRascal © (2004-06-15 19:17) [3]
> [1] panov © (15.06.04 19:05)
Вы наверно неправильно меня поняли. Мне нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
← →
panov © (2004-06-15 19:37) [4]1.
DT_WORDBREAK: Перенос по словам и символам перевода строки+возврат каретки.
DT_CALCRECT: Расчет необходимой области(TRect) для перенесенной строки(Rect1);
2. Вывод строки с переносами в прямоугольную область Rect1(вычисленную на предыдущем шаге)
← →
RealRascal © (2004-06-15 19:56) [5]
>
> > [1] panov © (15.06.04 19:05)
>
> Вы наверно неправильно меня поняли. Мне нужно выводить строку
> на канвас, мне надо, чтобы сама строка изменилась с учетом
> ширины Rect1 и переносом по словам. Проще говоря, требуется
> чтобы сабж расставил, где надо, #13#10.
Тьфу, извиняюсь, пропустил НЕ
Вы наверно неправильно меня поняли. Мне НЕ нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
← →
panov © (2004-06-15 20:03) [6]>RealRascal © (15.06.04 19:56) [5]
Вы наверно неправильно меня поняли. Мне НЕ нужно выводить строку на канвас, мне надо, чтобы сама строка изменилась с учетом ширины Rect1 и переносом по словам. Проще говоря, требуется чтобы сабж расставил, где надо, #13#10.
А вот это уже значительно сложнее-)
← →
panov © (2004-06-15 20:33) [7]Расставлять переносы придется вручную. Есть несколько способов.
Вот пара из них:
1.
- вычисляем приблизительную длину строки, которая может войти без переносов в ширину Rect (Например,Canvas.TextWidth)
- пользуемся некой функцией расстановки переносов (например, стандартной WrapText), уменьшая правую границу на 1-2 символа.
- в результате получаем строку с разделителями, которую затем обрабатываем для вывода построчно.
2.
- Если в строке символы должны выводиться разными стилями, то пробегаем в цикле по строке, вычисляя ширину каждого символа пикселях.
- Как только сумма Width символов превысит ширину Rect, обрезаем по послежднему слову, которое вместилось целиком.
- далее выводим строку на канву.
← →
RealRascal © (2004-06-15 20:36) [8]И вот еще что примечательно, AV возникает, на там говорится не про project1, а про NTdll.dll!
← →
RealRascal © (2004-06-15 20:52) [9]Я то думал, что DrawText это делает, если ему указать флаг DT_MODIFYSTRING... Надо только его вызвать привильно...
← →
RealRascal © (2004-06-16 06:52) [10]UP
Страницы: 1 вся ветка
Текущий архив: 2004.07.04;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.025 c