Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вопросы по DrawGrid


Автор: CrazyDaver 27.4.2011, 13:37
В каждой ячейке DrawGrid'а рисуется определённый bitmap. При скроллинге таблицы заметно мерцает первый или последний столбец или строка, в зависимости от направления скроллинга. 
Каждый bitmap состоит из 2 или 3 слоёв bitmap'ов с альфа-каналами. Рисую всё в памяти с помощью BitBlt и TransparentBlt (копирую нужные области из более крупных bitmap'ов), потом вывожу BitBlt'ом или StretchBlt'том готовый bitmap на canvas DrawGrid'а. 

Как избавится от мерцания, и, по возможности, ускорить отрисовку?

Есть ещё одна проблема:
Раньше при перекрытии формы другим окном часть canvas'а стиралась. Потом прописал в OnPaint перерисовку, и всё стало нормально. Теперь, когда убираю перерисовку, то окно всё равно обновляется. 

В чём дело?

Автор: Frees 27.4.2011, 14:12
Попробуй рисовать в событии DrawGrid'а - OnDrawCell.
для ускорения храни многослойную результирующую картинку и выводи ее н а канву в  OnDrawCell.

Автор: CrazyDaver 27.4.2011, 14:39
Я в OnDrawCell и рисую, и вывожу на canvas там же.
С хранением сложнее, т.к. накладываются слои в зависимости от параметра, который контролирует пользователь (могут быть наложены все слои, только один или два любых слоя), т.е. для всех состояний нужно от трёх (2 слоя) до семи (3 слоя) огромных (около 1000х1000 точек) bitmap'ов.

Автор: Frees 27.4.2011, 14:50
Цитата(CrazyDaver @  27.4.2011,  17:39 Найти цитируемый пост)
С хранением сложнее, т.к. накладываются слои в зависимости от параметра, который контролирует пользователь (могут быть наложены все слои, только один или два любых слоя), т.е. для всех состояний нужно от трёх (2 слоя) до семи (3 слоя) огромных (около 1000х1000 точек) bitmap'ов.


Что касается ускорения - суть такакя.
для каждой ячейки  создаем Битмап (Хранилище)
при смене параметров пользователем, рисуешь многослойную картинку ,не на Canvas DrawGrid'а! а на Хранилище, и вызываем DrawGrid1.Invalidate;
в событии OnDrawCell просто рисуешь битмап хранилище на Canvas DrawGrid'а.

Убрать мерцание можно попробовать с помощью

Код

Form1.DoubleBuffered := True;

или
http://www.delphisources.ru/pages/faq/base/drawing_without_twinkling.html

Автор: CrazyDaver 27.4.2011, 15:16
Цитата

Убрать мерцание можно попробовать с помощью
Form1.DoubleBuffered := True;
или
http://www.delphisources.ru/pages/faq/base..._twinkling.html

Уже пробовал, не помогает.

С хранилищем можно попробовать. 
А возможно ускорить само рисование в памяти, накладывание слоёв, например, scanline'ом каким-нибудь или чем-то ещё?

Автор: CrazyDaver 28.4.2011, 12:17
Цитата(Frees @  27.4.2011,  14:50 Найти цитируемый пост)
Что касается ускорения - суть такакя.для каждой ячейки  создаем Битмап (Хранилище)присмене параметров пользователем рисуешь многослойную картинку(не на Canvas DrawGrid'а!), и вызываем DrawGrid1.Invalidate;в событии OnDrawCell просто рисуешь битмап хранилище на Canvas DrawGrid'а.

После того, как сделал буферный bitmap для всей таблицы, и в OnDrawCell стал копировать из него нужную область, мерцание стало немного поменьше. 
После DrawGrid.DoubleBuffered:=True заметного мерцание вообще не стало.

Frees, спасибо за помощь!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)