Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.047 c
8-1082552507
zoltan
2004-04-21 17:01
2004.07.04
Анимация


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


14-1087046197
Pat
2004-06-12 17:16
2004.07.04
Магистратура


1-1087742551
Zema
2004-06-20 18:42
2004.07.04
Подскажите Мастера, как симмитировать нажатие клавиши...


6-1084219742
ZDDR
2004-05-11 00:09
2004.07.04
idudpserver1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский