Текущий архив: 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.48 MB
Время: 0.042 c