Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Создание компонента: как корректно рисовать


Автор: Alexeyt 6.8.2007, 01:33
Компонент делает следующее (наследник TGraphicControl):
в Paint запускает таймер, и уже таймер через NNN мс вызывает отрисовку. Т.е. отрисовка на канве делается уже не в Paint.

Все нормально, только контрол (метка), выведенный поверх моего к-та, после такой моей отрисовки не перерисовывается сам. Поэтому после моей отрисовки метка затирается - плохо. Что с этим делать?

Автор: Coder 6.8.2007, 05:19
Ну правильно ты же рисуешь свой компонент после отрисовки всей формы. Рисуй перед. 

И зачем ты используешь таймер?

Автор: Alexeyt 6.8.2007, 09:32
Цитата(Coder @ 6.8.2007,  05:19)
Ну правильно ты же рисуешь свой компонент после отрисовки всей формы. Рисуй перед. 

И зачем ты используешь таймер?

Не понял, что значит "перед"?

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

Автор: Snowy 6.8.2007, 09:39
Тогда убирай метку. Рисуй текст сам.
Метка не имеет своего окна, поэтому рисуется на твоём.
А ты рисуешь снова. Вот и затирается.
Если уж так хочется по таймеру рисовать, рисуй и текст сам.
Или оптимизируй отрисовку - нарисуй всё на битмапе, а потом уже готовый и подсовывай.

Автор: Alexeyt 6.8.2007, 21:35
Snowy, спасибо.
речь про компонент http://atorg.net.ru/delphi/atimagebox.htm. Смотри картинку: там нельзя метку (белая в левом верхнем углу) рисовать самому, она же не полностью лежит на картинке.

Когда картинка перерисовывается (по таймеру), метка затирается. пробую делать Invalidate метки, не помогает: после этого вызывается мой Paint (все зацикливается).

Автор: Snowy 7.8.2007, 00:11
Так я и говорю. При отложенной отрисовке, данный компонент работать не будет.
Ты его затираешь.
Посему выбрось его нафиг и рисуй текст сам.
Попытка его инвалидировать только вызовет твой репаинт, который снова запустит таймер.
Вобщем 2 варианта:
1. Рисовать по WM_PAINT
2. Забить на метку и рисовать всё самому, ибо метка рисуется по WM_PAINT, а ты позже.

Автор: Alexeyt 7.8.2007, 19:59
Спасибо. нашел обходной способ...

Автор: SkillHunter 8.8.2007, 10:23
Я всегда делал так - отрисовывал через WM_PAINT, а в нужный момент (событие) просто вызывал Invalidate для моего компонента, который ставил мой компонент в очередь на прорисовку. В таймере можно также сделать, не рисовать на прямую из него, а просто вызывать Invalidate.

Автор: Alexeyt 8.8.2007, 11:02
Я уже разобрался без WM_PAINT.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)