Главная страница
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.029 c
1-1087329553
AAAlexeyAAA
2004-06-15 23:59
2004.07.04
Ув. мастера. К вам вопрос о представлении типов данных.


11-1076272038
DDA
2004-02-08 23:27
2004.07.04
Много BitBtn ов


1-1087478400
Leron
2004-06-17 17:20
2004.07.04
А как получить имена всех запущенных файлов word a


4-1085490669
миша
2004-05-25 17:11
2004.07.04
помогите в написании драйвера для нестанд устройства


14-1087117490
Piter
2004-06-13 13:04
2004.07.04
Давайте поиграем в ассоциации