Главная страница
    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.48 MB
Время: 0.048 c
15-1185860176
Кирей
2007-07-31 09:36
2007.08.26
как победить рутинные операции


15-1185885464
Piter
2007-07-31 16:37
2007.08.26
Где хранят информацию Java MIDP программы?


15-1185270324
DillerXX
2007-07-24 13:45
2007.08.26
Восход Эндимиона - это последняя книга?


2-1186045260
_Tehnik_
2007-08-02 13:01
2007.08.26
Приложение на переднем плане и исчо кое что постаршнее


2-1186219361
AMD
2007-08-04 13:22
2007.08.26
Склеить формы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский