Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.032 c
4-1085380368
_shark_
2004-05-24 10:32
2004.07.04
Мастера, кто нить может подкинуть описание функции


3-1086330720
avgur
2004-06-04 10:32
2004.07.04
Помогите составить запрос.(я уже туплю)...


4-1085565849
Yustas
2004-05-26 14:04
2004.07.04
Память


1-1087407379
M@jor
2004-06-16 21:36
2004.07.04
Обработчик для прокрутки


1-1087307697
Apocalepse
2004-06-15 17:54
2004.07.04
Срочно пожалуста, как сделать свою прогу поверх всех окон