Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

Мерцание при обработке Resize   Найти похожие ветки 

 
Alextp ©   (2006-06-10 20:09) [0]

Компонент рисует на канве. После нажатия клавиш делается скролл и перерисовка: все хорошо, мерцания нет. Но: перерисовка делается и в методе Resize: а тут уже плохо, мерцание есть и сильное (под WinXP).

Код примерно такой:
Redraw: моя процедура, делающая перерисовку буфера и вызывающая Paint;
Paint (override): вызывает Canvas.Draw(0, 0, FBitmap);  т.е. отрисовку буфера.
Rezize (override): вызывает только Redraw;

В чем проблема?
Кажется, при Resize помимо вызова моей Redraw где-то в VCL вызывается "своя" перерисовка, из-за чего и набл. мерцание. Но как это поправить?


 
Alextp ©   (2006-06-10 20:29) [1]

Добавление: мерцание при ризайзе есть даже если вообще убрать у меня метод Resize. То есть проблема кажется где-то в VCL... или я чего-то не учел.


 
Юрий Зотов ©   (2006-06-10 21:07) [2]

Трудно сказать, не видя кода, но навскидку - слишком много перерисовок. По идее, должно хватать одного только Paint, но если этого недостаточно,  то вызывайте Invalidate, а не прямое рисование. Еще - посмотрите DoubleBuffered, тоже может помочь.


 
Макс Черных ©   (2006-06-10 21:19) [3]

Первым делом надо поставить в конструкторе.

DoubleBuffered := true;
ControlStyle := ControlStyle + [csOpaque];


А вообще, посмотри метод TWinControl.WMEraseBkgnd
Сразу станет понятно - что моргает, зачем моргает.


 
Alextp ©   (2006-06-10 23:30) [4]

DoubleBuffered := true;

- помогло. Спасибо!
csOpaque тоже полезный флаг, но и без него все хорошо. Я кстати не понял из хелпа зачем он нужен:

csOpaque
 The control completely fills its client rectangle.

- Это мой случай, кстати.


 
Макс Черных ©   (2006-06-12 17:20) [5]


> Я кстати не понял из хелпа зачем он нужен


Суть простая. Если control имеет csOpaque, то следовательно закрывает (т.е. рисует сам) всю клиентскую область. Следовательно, системе нет надобности стирать фон, т.е. делать EraseBackGround. Соответственно, нет и моргания на перерисовке. В принципе, при DoubleBuffered := true оно и так не моргает, но по правильному надо ставить csOpaque.



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

Форум: "Компоненты";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.043 c
15-1171701023
Александр Иванов
2007-02-17 11:30
2007.03.18
Дважды MCP


2-1172486280
tmp
2007-02-26 13:38
2007.03.18
Как загрузить иконку программы в ImageList?


2-1172612130
Lonix
2007-02-28 00:35
2007.03.18
Копирование файла


2-1172586018
Sapos
2007-02-27 17:20
2007.03.18
Создание таблицы программым способом.


15-1172092407
Gero
2007-02-22 00:13
2007.03.18
Креативные часы от Лебедева





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский