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

Вниз

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

 
Rat Rat   (2006-09-25 16:46) [0]

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


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


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

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


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

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


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

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


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

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


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

Спасибо.


 
AlexeyT ©   (2006-09-26 22:38) [6]

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


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

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


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


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

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


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

To AlexeT

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

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


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

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

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

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


 
badevlad ©   (2006-10-04 15:57) [11]

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

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

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


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

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

Ok. Попробую.

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

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


 
badevlad ©   (2006-10-09 11:01) [13]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
2-1186330517
KLAUS_
2007-08-05 20:15
2007.08.26
Xor части файла


2-1186160090
sashap
2007-08-03 20:54
2007.08.26
Замена popmenu в tstringgrid е


15-1185518158
DevilDevil
2007-07-27 10:35
2007.08.26
Умная литература. Ведение/планирование проекта/подзадачи


2-1185742968
mfender
2007-07-30 01:02
2007.08.26
Integer в минуты средствами SQL в MSSQL


2-1185554076
master_asasin
2007-07-27 20:34
2007.08.26
ImageList - добавление картинок в RunTime