Перерисовка окна
От: Paladinm  
Дата: 27.08.03 08:51
Оценка:
Жутко колбасит контролы на окне, во время его переисовки, вызваной изменением размеров формы.
Господа, помогите избавиться от этого жуткого "прыганья" контролов!

Имеется форма, с закругленными углами.
Написана своя панель (наследник то TCustomPanel).
Панель также имеет закругленные углы, да еще и свою отрисовку — довольно сложную.
В результате панель выглядит как объемная с плавными градиентами по краям.

Форма состоит из этих панелей. Одни вложены в другие.
Все панели выравниваються и якоряться.
На панелях располоджены контролы, например, TDrawingGrid

При изменении размеров формы если других контролов, кроме панелей нет, то все происходит гладко.
Но как только добавляешь контрол — накчинает жутко колбасить, что выражается в том, что контрол как бы вылазит вперед.
Например, при увеличении размеров формы вправо, во время самого процесса, панели еще не успевают перерисоваться, а контролы уже успевают.
Получается эффект, как будто контролы вылазят за границы формы.

Всяческие DoubleBuffered не помогают.
Если запретить отрисовку окна при помощи LockWindowUpdate, то все работает нормально, за исключением того,
что все остальные окана начинают перерисовываться, т.е. при изменении размеров формы, несколько раз перерисовываются весь рабочий стол.
Такой вариант не подходит.

Предполагаю, что во время изменения размеров окна, вместо одного просчета будущего расположения контролов, с учетом выравниваний и якорей, и одной их финальной отрисовкой, происходит многократная перериовка контролов при выравнивании.

Интуитивно чувствую, что нужно бы отрисовать всю форму со всеми контролами в память, а потом уже, когда все займут свои места — отрисовать на экран. Но не знаю, как это сделать.

Помогите, господа!
Re: Перерисовка окна
От: ArtDenis Россия  
Дата: 27.08.03 09:08
Оценка:
Здравствуйте, Paladinm, Вы писали:

P>Жутко колбасит контролы на окне, во время его переисовки, вызваной изменением размеров формы.

P>...
P>Интуитивно чувствую, что нужно бы отрисовать всю форму со всеми контролами в память, а потом уже, когда все займут свои места — отрисовать на экран. Но не знаю, как это сделать.

Для начала попробуй FullRepaint=true; для панелей, может помочь.
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Перерисовка окна
От: ArtDenis Россия  
Дата: 27.08.03 09:10
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Paladinm, Вы писали:


P>>Жутко колбасит контролы на окне, во время его переисовки, вызваной изменением размеров формы.

P>>...
P>>Интуитивно чувствую, что нужно бы отрисовать всю форму со всеми контролами в память, а потом уже, когда все займут свои места — отрисовать на экран. Но не знаю, как это сделать.

AD>Для начала попробуй FullRepaint=true; для панелей, может помочь.


Блин, конечно же FullRepaint=false; !!!
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Перерисовка окна
От: Paladinm  
Дата: 27.08.03 14:25
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>>Для начала попробуй FullRepaint=true; для панелей, может помочь.

AD>Блин, конечно же FullRepaint=false; !!!

— Не, не помогло. Все по прежнему.
Найти бы метод в память отриовать, а уже потом на экран...
Re: Перерисовка окна
От: Paladinm  
Дата: 27.08.03 15:06
Оценка:
Здравствуй, Paladinm, Мы писали:

P>Например, при увеличении размеров формы вправо, во время самого процесса, панели еще не успевают перерисоваться, а контролы уже успевают.

P>Получается эффект, как будто контролы вылазят за границы формы.

P>Предполагаю, что во время изменения размеров окна, вместо одного просчета будущего расположения контролов, с учетом выравниваний и якорей, и одной их финальной отрисовкой, происходит многократная перериовка контролов при выравнивании.


Нашел не очень красивое решение (на этом же форуме...)
Размер окна я изменяю при помощи MoveWindow( ...)
Так вот, всем контролам, которые колбасятся делаем WM_SETREDRAW:
SendMessage( KolbasaCtrl.Handle, WM_SETREDRAW, 0, 0); // отмена перерисовки

MoveWindow( Handle, ...)                              // изменяем размеры окна

SendMessage( KolbasaCtrl.Handle, WM_SETREDRAW, 1, 0); // включение перерисовки
InvalidateRect( KolbasaCtrl.Handle, 0, false );       // рисуем контрол

— И все, после этого колбаса заканчивается.

Конечно, лучше бы в память все контролы отрисовывать...
Может кто-то знает как?
Re[2]: Перерисовка окна
От: ArtDenis Россия  
Дата: 27.08.03 15:22
Оценка:
Здравствуйте, Paladinm, Вы писали:

P>Здравствуй, Paladinm, Мы писали:


P>>Например, при увеличении размеров формы вправо, во время самого процесса, панели еще не успевают перерисоваться, а контролы уже успевают.

P>>Получается эффект, как будто контролы вылазят за границы формы.

P>>Предполагаю, что во время изменения размеров окна, вместо одного просчета будущего расположения контролов, с учетом выравниваний и якорей, и одной их финальной отрисовкой, происходит многократная перериовка контролов при выравнивании.


P>Нашел не очень красивое решение (на этом же форуме...)

P>Размер окна я изменяю при помощи MoveWindow( ...)
P>Так вот, всем контролам, которые колбасятся делаем WM_SETREDRAW:
P>
P>SendMessage( KolbasaCtrl.Handle, WM_SETREDRAW, 0, 0); // отмена перерисовки

P>MoveWindow( Handle, ...)                              // изменяем размеры окна

P>SendMessage( KolbasaCtrl.Handle, WM_SETREDRAW, 1, 0); // включение перерисовки
P>InvalidateRect( KolbasaCtrl.Handle, 0, false );       // рисуем контрол
P>

P>- И все, после этого колбаса заканчивается.

P>Конечно, лучше бы в память все контролы отрисовывать...

P>Может кто-то знает как?

Form->PaintTo(Bitmap->Canvas, 0, 0);
Form->Canvas->Draw(0, 0, Bitmap);


А перед этим создаёшь Bitmap типа TBitmap.

... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.