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

Вниз

Замена DrawText (перенос строк)   Найти похожие ветки 

 
panov ©   (2004-04-23 20:52) [0]

Есть ли замена функции DrawText(DC, @Text[1], -1, R,DT_WORDBREAK+DT_CALCRECT), работающая быстрее?


 
miek ©   (2004-04-23 21:10) [1]

TextOut по-любому быстрее.
Еще можно поиграться со стилями отсечения и сглаживания шрифта.


 
panov ©   (2004-04-23 21:18) [2]

>miek ©   (23.04.04 21:10) [1]
А с переносом слов как быть?


 
miek ©   (2004-04-23 21:41) [3]

Можно регион отсечения создать на DC


 
panov ©   (2004-04-23 21:52) [4]

>panov ©   (23.04.04 21:18) [2]

Регион отсечения - не пойму, как им можно воспользоваться.

Можно пояснить?


 
MBo ©   (2004-04-24 07:00) [5]

>Регион отсечения - не пойму, как им можно воспользоваться.
В данном случае -это не нужно.


 
ЮЮ ©   (2004-04-24 07:20) [6]

Пррблема огромного монитора, на который можно вывести столько информации, что Windows не успевает? :-) Может, всe же, проблема не в скорости, а в частоте напрасных вызовов?


 
MBo ©   (2004-04-24 08:45) [7]

Александр, опиши задачу поподробнее.
Есть еще DrawTextEx, ExttextOut (эта - без переноса строк)  но не исключено, что под конкретную проблему можно написать специализированную функцию, использующую GetTextExtent32 или GetCharABCWidth и т.п. функции.


 
panov ©   (2004-04-24 15:42) [8]

>MBo ©   (24.04.04 08:45) [7]

Александр, опиши задачу поподробнее.

Я в "Потрепаться" задавал другой вопрос - тоже по этой же задаче, но так как на тот момент приемлимого алгоритма нполучилось найти, остановился пока на варианте с DrawText. Сейчас там появился алгоритм от MBO,Sha.

Описываю задачу.

Есть текстовый файл. Текстовый файл загружается напр. в TStringList. Строк в файле может быть много, но думаю, что не более 20-50 тысяч(это пусть будет краевое устовие).

Реальное при работе с программо число строк может колебаться от нескольких десятков до 2-3 тысячи.
Эти строки нужно отрисовывать на канве TPaintBox вручную.
При этом должна правильно вычисляться позиция вертикально TScrollBar.

Алгоритм подготовки строк для отрисовки, как мне кажется, может быть различным.

Подготавливается массив объектов примерно такого вида:

  TObj=record
     R: TRect;
     Len: Integer;   //Длина строки в символах
     Width: Integer; //Длина строки в пикселях
     Text: String;
  end;
 

 
var
 Arr: array of TObj;
 

либо фиксированного размера

 
var
  Arr: array[1..100000] of TObj;  
  ArrLen: Integer
 

Отрисовка идет только видимой части строк, но, несмотря на это, при изменениях размеров видимой области нужно массив полностью пересчитывать. Для этого может быть 2 варианта:

1. Обработать массив исходных строк, реализовав максимально быстрый алгоритм вычисления переносов строк по символам-разделителям.
2. Воспользоваться реализованной в MS Windows функцией DrawText для получения области Rect с автоматическим переносом строк.

во втором случае массив объектов формируется в цикле (получаем размеры каждой строки без отрисовки на канве) с последующим отображением только видимой части путем вычисления квадрата из TObj.R;

Первый вариант пока достаточно оптимально реализовать не удалось

Второй вариант достаточно быстрый, но на медленных компьютерах(P200,RAM 64Mb, например) процесс обработки 20000 строк может занимать до 5-7 секунд. Это время не устраивает.

хотя если длинных строк не так уж и много, обработка занимает до 0.7-1 сек.


 
panov ©   (2004-04-24 15:46) [9]

Кстати,ссылка на тему в Потрепаловке -
http://delphimaster.net/view/15-1082647615/


 
ЮЮ ©   (2004-04-26 04:18) [10]

>Реальное при работе с программо число строк может колебаться от нескольких десятков до 2-3 тысячи.
Эти строки нужно отрисовывать на канве TPaintBox вручную.

Да не вдезут 2-3 тысячи строк на экран !!! Поэтому достаточно вычислить высоту только для рисуемых в данный момент строк, а для остальных установить DefaultHeigh.

>При этом должна правильно вычисляться позиция вертикально TScrollBar.

У тебя будет меньше пикселя на строку, чего уж тут опасаться, что при первоначальной высоте 3000 * TextHeight кто заподозрит неточность TScrollBar-а

З.Ы. в результате получим практически TDrawGrid, у которого LeftTop ячейка не обязательно рисуется целиком



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1088353420
alexa
2004-06-27 20:23
2004.07.11
Курсор ввода в Edit


1-1088003235
Новенький
2004-06-23 19:07
2004.07.11
Имя файла


1-1088220292
Dr.Karter
2004-06-26 07:24
2004.07.11
MDIChild


3-1086973843
Дэвид
2004-06-11 21:10
2004.07.11
Трехзвенная архитектура...


6-1084346988
r9000
2004-05-12 11:29
2004.07.11
Вопрос по Web серверу?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский