| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Создание компонента: как корректно рисовать |
| Автор: Alexeyt 6.8.2007, 01:33 |
| Компонент делает следующее (наследник TGraphicControl): в Paint запускает таймер, и уже таймер через NNN мс вызывает отрисовку. Т.е. отрисовка на канве делается уже не в Paint. Все нормально, только контрол (метка), выведенный поверх моего к-та, после такой моей отрисовки не перерисовывается сам. Поэтому после моей отрисовки метка затирается - плохо. Что с этим делать? |
| Автор: Coder 6.8.2007, 05:19 |
| Ну правильно ты же рисуешь свой компонент после отрисовки всей формы. Рисуй перед. И зачем ты используешь таймер? |
| Автор: Alexeyt 6.8.2007, 09:32 | ||
Не понял, что значит "перед"? таймер для того, чтобы выполнять подробную отрисовку, когда п-ль закончит скроллинг (если рисовать все сразу, тормозит). |
| Автор: 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. |