Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Замена 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 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
4-1083161649
Бегун
2004-04-28 18:14
2004.07.11
Как запретить двигать форму?


3-1087358807
Tornado
2004-06-16 08:06
2004.07.11
Как отменить редактирование?


1-1088320850
georg
2004-06-27 11:20
2004.07.11
создание объектов


14-1087541950
Andryk
2004-06-18 10:59
2004.07.11
Однако как меня вчерась хорваты порадовали.


1-1087997302
XeLax
2004-06-23 17:28
2004.07.11
фокус и направление ввода