Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перерисовка, TCanvas и стандартные компоненты.


Rat Rat ©   (2006-09-25 16:46:00) 

Hi.

Изначально прошу прощения за длинный вопрос.
Есть задача: компонент с "насыщенной графикой". Причем даже не компонент, а класс (пока не суть важно). Для отображения графика. TChart проработан - капризен (многое не может из того, что нужно).

Компонент сделан. Рисует на объекте TCanvas. Все хорошо, но моргает или жутко торомозит в зависимости от того, "чья" канва используется.

Пример: уже что-то нарисовано, а на "елозенье" мышкой по компоненту должны возникать вертикальные и горизонтальные линии-маркеры (типа Guide Lines в граф. редакторах).

1. PaintBox дает быструю перерисовку, но моргает
2. Image не моргает, но дает тормозную перерисовку

Вариант с "игрой" на csOpaque у меня пошел только если Image находится на "голой" форме. А реально Image лежит на Panel, он на TabSheet, он на PageControl (простите), он на Form.

Я уже озадачился (и сделал) двойной буфер для компонента (через Draw). Но возникает вопрос, а как же "нормальные" компоненты? Что же, каждый раз нужно некий TBitmap делать и его "врисовывать"?

Кратко, нужен экспертный совет (того, кто уже делал свои компоненты/классы с насыщенной графикой).

а) канву какого компонента надо юзать, чтобы было "быстро" и "не мигало"

если это недостижимо, то

б) как правильно поюзать csOpaque (прошу прощения, но нужна ситуация, когда все лежит на всем, а не "голый" Image на Form)

если это непостижимо, то

в) жестко сказать, что только через двойной буфер (хотя большие сомнения)

P.S. Прошу простить меня за многословность. Достаточно будет хотя-бы ссылки на статью/книгу или экспертный совет 1...2 предложениями. Заранее благодарен.

Rat


badevlad   (2006-10-09 11:01:00) [1]

> А что, стандартные компоненты тоже юзают двойные буфера?
Да


Rat Rat   (2006-10-04 16:26:00) [2]

Спасибо Всем.

Ok. Попробую.

To badevlad: двойной буфер понятен, причем я уже достаточно извартился в этом, т.е. вполне могу делать даже не полную вставку, а вставку областей, подверженных изменениям. Я просто хотел услышать твердое "да" по поводу двойного буфера. И ждал еще вариантов. По-видимому, их нет.

А что, стандартные компоненты тоже юзают двойные буфера?
(Совет "посмотреть исходники стандартных компонентов" понятен. Хочется "готовых" советов :)


badevlad   (2006-10-04 15:57:00) [3]

Проблема стандартная и для ее решения существуют стандартные методы.

Для устранения "мигания" при отрисовке существует технология, называемая "двойной буферизацией". Все рисуется сначала на промежуточном битмапе, а потом одной командой выводится на канву компонента. Это несложно сделать самостоятельно - код усложнится на десяток строк. При использовании же стандартной панели перерисовка не будет "мигать" только в том случае, если включить ее свойство DoubleBuffered- это то, о чем я писал выше, только уже реализованное стандартными средствами.

Так же рекомендую обратить внимание на совет Суслика.


Суслик   (2006-10-01 22:12:00) [4]

линии можешь рисовать вообще в обработчике onmousemove. посредством xor заполнения. так, кстати, в стандартном StringGrid'е сделано - ресайз колонок сделан именно так. в принципе ничего не мешает.

другой вопрос, что в гриде перерисовка линий выполняется в onmousemove *после* нажатия кнопки (т.е. когда кнопка нажата), также реализован отказ от прорисовки линий при получении WM_CANCELMODE или CM_CANCELMODE.
у тебя же вроде кнопка не нажата, т.е. это отличие :)

но все же информация о том, что не обязательно рисовать в wm_paint, полагаю, может быть инетресна.


Rat Rat   (2006-09-29 19:28:00) [5]

To AlexeT

Спасибо. Насчет панели думал, но остановила "закрытость" Canvas. Конечно, нужно будет, обойду (и не только наследованием :).

To DimaBr
Тоже спасибо.


DimaBr   (2006-09-27 08:36:00) [6]


> (например WM_ERASEBKGND)
> .......
> Да, совет выше рисовать средствами WinAPI не очень умный

А совет не перерисовывать фон тоже не очень умный, так как я его уже огласил.


AlexeyT   (2006-09-26 22:41:00) [7]

Да, совет выше рисовать средствами WinAPI не очень умный. Т.к. отрисовка на канве через например TextOut это то же обращение к АПИ, только средствами VCL...


AlexeyT   (2006-09-26 22:38:00) [8]

TImage действительно дает тормозную отрисовку.
Советую наследовать от TPanel, я у себя так сделал, все летает.
А если мерцает при ресайзе - это другая проблема, решается перехватом кое-каких сообщений (например WM_ERASEBKGND).


Rat Rat   (2006-09-26 14:20:00) [9]

Спасибо.


DimaBr   (2006-09-26 09:10:00) [10]

Для быстрой прорисовки предлагается:
1. Рисовать на вспомогательном BitMape средствами WinAPI
2. Не перерисовывать фон, дабы не мелькало
3. Использовать DirectX


ProgRAMmer Dimonych   (2006-09-25 18:59:00) [11]

Может, стоит попробовать вспомогательный TBitmap?


Rat Rat   (2006-09-25 18:02:00) [12]

Прошу прощения, спрашивал ответ.
А получил вопрос.


DimaBr   (2006-09-25 17:01:00) [13]


> TChart проработан - капризен (многое не может из того, что нужно)

Может нет желания подумать над реализацией ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо