Плавно выдвигающееся окно
От: icezone  
Дата: 12.10.04 18:37
Оценка:
Очень хотелось бы узнать алгортм по которому во многих программах
окно настроек плавно выезжает вниз/в сторону от основного окна.
Например в Winamp со скинами MMD3 и Multipass так выдвигаются эквалайзер, настройки и .т.д.
Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками
и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.

Может быть есть у кого какие соображения?

15.10.04 07:37: Перенесено из 'Алгоритмы'
Re: Плавно выдвигающееся окно
От: Кодт Россия  
Дата: 12.10.04 18:46
Оценка:
Здравствуйте, icezone, Вы писали:

I>Может быть есть у кого какие соображения?


Например, выдвигающееся окошко лежит под основным. Его контур не меняется — только лишь положение.
Ну и отрисовка, естественно, через бит-блит (чтобы не мерцало при перемещениях).
Перекуём баги на фичи!
Re[2]: Плавно выдвигающееся окно
От: icezone  
Дата: 12.10.04 18:56
Оценка:
Как окно настроек заставить лежать под основным? Ладно — здесь
сделаем window.Hide
А что имеется в виду под прорисовкой через bitblt?
Куда мы будем прорисовывать окно настроек?

не представляю как это реализовать на Delphi — именно алгоритм действий.
Re: Плавно выдвигающееся окно
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 12.10.04 19:08
Оценка:
Здравствуйте, icezone, Вы писали:

[]

I>Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками

I>и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.

Неправильно, значит, пробовали. Идея такая (кстати, эта идея применяется мной и довольно успешно): при старте приложения/смене скинов просчитываются все нужные регионы, основываясь на битмапах. Работает это не просто быстро, а очень быстро, благо, в "Исходниках" есть сорцы хорошей и быстрой функции.

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

Так что — дело в грамотности реализации
... << RSDN@Home 1.1.3 stable >>
Re[2]: Не совсем согласен
От: icezone  
Дата: 12.10.04 19:48
Оценка:
Пробовал я правильно, но:
1. При старте я создаю регион основного и вспомогательного окна.
Это уже не достаточно быстро — порядка 13 мс, но это не критично.

2. Выдвигается не область, а окно. Разница небольшая есть?
У меня оба окна непрямоугольные, поэтому делаем последовательно combinergn. Это как раз проходит быстро. Смещение окна тоже не тормозит.
Тормозит вызов функции setwindowrgn! Это API и я не могу здесь ни на что повлиять.
3. Развивая вашу мысль, я попробую изменить алгоритм следующим образом:
Я не буду смещать дочернее окно, а отрисую его битмап на основном окне и
буду менять именно регион основного окна, а когда прорисовка завершиться, то просто покажу по этим координатам дочернее окно, а основное окно верну к первоначальному виду. Оно?
4. На счет скорости алгоритма я могу сказать только одно: после всевозможных оптимизаций рывки и мерцание удалось побороть, но скорость не увеличилась. Я двигаю окно таймером и если делать интервал таймера меньше 100 мс, то скорость движения не увеличится. Для меня это начит — тормозит.
Re[2]: Плавно выдвигающееся окно
От: icezone  
Дата: 12.10.04 20:08
Оценка:
Посмотрел как сделано в Winamp Modern Skin.
Здесь изначально основное окно имеет больший размер, чем видно
и идет работа со слоями — они выдвигаются в прозрачную область.
Реализовать это на Win2K/XP легко, но Winamp нормально работает и под Win9x. Пока я не встречал ни одной корректной реализации прозрачного окна для Win9x.
Как это делают в NullSoft?
Re: Плавно выдвигающееся окно
От: Sergey J. A. Беларусь  
Дата: 13.10.04 05:59
Оценка:
Здравствуйте, icezone, Вы писали:

I>Очень хотелось бы узнать алгортм по которому во многих программах

I>...

Может ещё кто подскажет по какой функции (ширина от времени ?) можно красиво выдвинуть окно. Т.е. чтоб вначале выдвижение было быстрым, а когда почти всё окно выползет — замедлялось.
Я — свихнувшееся сознание Джо.
Re[2]: Плавно выдвигающееся окно
От: Кодт Россия  
Дата: 13.10.04 07:53
Оценка: 1 (1) +1
Здравствуйте, Sergey J. A., Вы писали:

SJA>Может ещё кто подскажет по какой функции (ширина от времени ?) можно красиво выдвинуть окно. Т.е. чтоб вначале выдвижение было быстрым, а когда почти всё окно выползет — замедлялось.


По параболе. Как камень, брошенный вверх.
h(t) = t*v0 — t^2*g/2
v(t) = v0 — t*g
Время и высота находятся из v(T)=0, H=h(T)
T = v0/g, H = v0^2/2g
Отсюда, если известны H и T, найдём скорость и ускорение (то есть, замедление )
v0 = 2H/T
g = 2H/T^2
Перекуём баги на фичи!
Re: Плавно выдвигающееся окно
От: OlegO Россия http://www.mediachase.ru
Дата: 13.10.04 11:49
Оценка:
Здравствуйте, icezone, Вы писали:

I>Очень хотелось бы узнать алгортм по которому во многих программах

I>окно настроек плавно выезжает вниз/в сторону от основного окна.
I>Например в Winamp со скинами MMD3 и Multipass так выдвигаются эквалайзер, настройки и .т.д.
I>Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками
I>и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.

I>Может быть есть у кого какие соображения?


http://gzip.rsdn.ru/Forum/?mid=9476
Автор: OlegO
Дата: 19.10.01


http://gzip.rsdn.ru:80/File/817/TestFloat.zip
С уважением, OlegO.
Re: Плавно выдвигающееся окно
От: EqWu Россия  
Дата: 13.10.04 12:32
Оценка:
Здравствуйте, icezone, Вы писали:

I>Очень хотелось бы узнать алгортм по которому во многих программах

I>окно настроек плавно выезжает вниз/в сторону от основного окна.

I>Может быть есть у кого какие соображения?


Если не пытаться найти универсальное решение и забить на Win95, то может подойти AnimateWindow.
У нее, правда, есть ряд ограничений...
Re[3]: Плавно выдвигающееся окно
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.10.04 12:52
Оценка:
Здравствуйте, Кодт, Вы писали:
Таким образом,
h(t)=H*t/T*(2 — t/T)
у нас все целочисленное (и t и h), поэтому для заданного T можно построить таблицу коэффициентов. Например, для T=10:
t    k
0    0
1    0.19
2    0.36
3    0.51
4    0.64
5    0.75
6    0.84
7    0.91
8    0.96
9    0.99
10   1


Для перемещения объектов из пункта А в пункт Б лучше использовать тригонометрию — чтобы объект сначала плавно разгонялся, а потом замедлялся.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.