C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Resize без Repaint
lobster
Отправлено: 04.06.2004, 12:07


Ученик-кочегар

Группа: Участник
Сообщений: 4



Ребята, у меня возникла такая проблема:
Мне надо изменять размер окна так, чтобы его содержимое при этом не перерисовывалось до окончания ресайза ( там у меня типа полно графики, которая прорисовывается очень тормозно ).
Пожалуйста, может кто посоветует как это сделать ( диплом горит sad.gif )
olegenty
Отправлено: 04.06.2004, 12:32


Ветеран

Группа: Модератор
Сообщений: 2412



у всех родителей и потомков задай ControlStyle = csOpaque; (например в обработчике OnCreate формы)
olegenty
Отправлено: 04.06.2004, 12:35


Ветеран

Группа: Модератор
Сообщений: 2412



да, и ещё DoubleBuffered = true, у всех контролов в том же обработчике.
lobster
Отправлено: 04.06.2004, 19:25


Ученик-кочегар

Группа: Участник
Сообщений: 4



К сожалению этот метод не подействовал. Картинка по-прежнему пытается вылезти когда не надо.

Я тут нашел в справочнике описание этого свойства, там сказано, что при ControlStyle.Contains(csOpaque) "компонент полностью заполняет собой клиентскую область". Честно говоря не понял, как это связано с моим вопросом.

Я сам думал вот в каком направлении:
Если бы я мог отловить моменты начала и конца ресайза, то достаточно было бы просто заблокировать перерисовку в промежутке между ними. Но если с началом всё понятно ( событие OnCanResize ), то с окончанием — загвоздка. На события OnMouseDown и OnMouseUp форма в этот момент не реагирует ( иначе второй момент я просто отследил бы по отпусканию мыши ). Вообщем получив ответ на этот вопрос, я получу ответ и на главный.

Кстати фишку про DoubleBuffered я не знал — полезная штука.

З.Ы. Я работаю в 6-м Билдере ( вдруг это имеет значение ).
olegenty
Отправлено: 07.06.2004, 07:12


Ветеран

Группа: Модератор
Сообщений: 2412



у тебя что за компонент рисующий? вообще-то на все стандартные это действует на ура. только и у самой формы эти св-ва надо установить, и у компонентов. это уже обсуждалось в данном форуме и на ура работало...
lobster
Отправлено: 07.06.2004, 09:51


Ученик-кочегар

Группа: Участник
Сообщений: 4



PaintBox у меня. И свойство я установил у всех компонентов ( ну у тех где оно вообще есть ). В принципе, проблему я частично решил с помощью таймера — отслеживаю время с момента последнего OnCanResize. Вроде нормально получилось. Так что я думаю вопрос можно закрыть.
olegenty
Отправлено: 07.06.2004, 13:59


Ветеран

Группа: Модератор
Сообщений: 2412



нет, нельзя его закрыть. в каком событии рисованием занимался...?
вопрос надо добить...
MDM
Отправлено: 08.06.2004, 13:44


Не зарегистрирован







WM_SETREDRAW
lobster
Отправлено: 10.06.2004, 08:39


Ученик-кочегар

Группа: Участник
Сообщений: 4



Да, добить хотелось-бы.
На форме у меня расположен PaintBox ( если точнее — то на панели ). Перерисовка висит на его событии OnPaint. Принудительно метод перерисовки нигде не вызывается.

Кстати попутно хотел спросить: если я устанавливаю в true свойство DoubleBuffered могу ли я отказаться от программной буферезации ( т.е. не рисовать картинку сначала в памяти, а только потом копировать её на экран )?
olegenty
Отправлено: 10.06.2004, 08:56


Ветеран

Группа: Модератор
Сообщений: 2412



можешь, ради этого св-во и создано. но есть ограничения: ряд компонентов сами организуют буферизацию (TRichEdit), и там использование св-ва ни к чему хорошему не приведёт. но с PaintBox всё нормально.

Вернуться в Вопросы программирования в C++Builder