Очень хотелось бы узнать алгортм по которому во многих программах
окно настроек плавно выезжает вниз/в сторону от основного окна.
Например в Winamp со скинами MMD3 и Multipass так выдвигаются эквалайзер, настройки и .т.д.
Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками
и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.
Здравствуйте, icezone, Вы писали:
I>Может быть есть у кого какие соображения?
Например, выдвигающееся окошко лежит под основным. Его контур не меняется — только лишь положение.
Ну и отрисовка, естественно, через бит-блит (чтобы не мерцало при перемещениях).
Как окно настроек заставить лежать под основным? Ладно — здесь
сделаем window.Hide
А что имеется в виду под прорисовкой через bitblt?
Куда мы будем прорисовывать окно настроек?
не представляю как это реализовать на Delphi — именно алгоритм действий.
[]
I>Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками I>и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.
Неправильно, значит, пробовали. Идея такая (кстати, эта идея применяется мной и довольно успешно): при старте приложения/смене скинов просчитываются все нужные регионы, основываясь на битмапах. Работает это не просто быстро, а очень быстро, благо, в "Исходниках" есть сорцы хорошей и быстрой функции.
Затем, когда необходимо реализовать выдвигание непрямоугольной области — регионы последовательно назначаются окну. Это тоже работает быстро.
Пробовал я правильно, но:
1. При старте я создаю регион основного и вспомогательного окна.
Это уже не достаточно быстро — порядка 13 мс, но это не критично.
2. Выдвигается не область, а окно. Разница небольшая есть?
У меня оба окна непрямоугольные, поэтому делаем последовательно combinergn. Это как раз проходит быстро. Смещение окна тоже не тормозит.
Тормозит вызов функции setwindowrgn! Это API и я не могу здесь ни на что повлиять.
3. Развивая вашу мысль, я попробую изменить алгоритм следующим образом:
Я не буду смещать дочернее окно, а отрисую его битмап на основном окне и
буду менять именно регион основного окна, а когда прорисовка завершиться, то просто покажу по этим координатам дочернее окно, а основное окно верну к первоначальному виду. Оно?
4. На счет скорости алгоритма я могу сказать только одно: после всевозможных оптимизаций рывки и мерцание удалось побороть, но скорость не увеличилась. Я двигаю окно таймером и если делать интервал таймера меньше 100 мс, то скорость движения не увеличится. Для меня это начит — тормозит.
Посмотрел как сделано в Winamp Modern Skin.
Здесь изначально основное окно имеет больший размер, чем видно
и идет работа со слоями — они выдвигаются в прозрачную область.
Реализовать это на Win2K/XP легко, но Winamp нормально работает и под Win9x. Пока я не встречал ни одной корректной реализации прозрачного окна для Win9x.
Как это делают в NullSoft?
Здравствуйте, icezone, Вы писали:
I>Очень хотелось бы узнать алгортм по которому во многих программах I>...
Может ещё кто подскажет по какой функции (ширина от времени ?) можно красиво выдвинуть окно. Т.е. чтоб вначале выдвижение было быстрым, а когда почти всё окно выползет — замедлялось.
Здравствуйте, 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
Здравствуйте, icezone, Вы писали:
I>Очень хотелось бы узнать алгортм по которому во многих программах I>окно настроек плавно выезжает вниз/в сторону от основного окна. I>Например в Winamp со скинами MMD3 и Multipass так выдвигаются эквалайзер, настройки и .т.д. I>Для начала я пробовал менять регион окна от узкой полоски до полного размера и сдвигать окно настроек вниз. Работает, но медленно, рывками I>и мерцанием. Причем самая проблемная часть в этом варианте setwindowregion — она вызывает большую задержку. Да и combineregion тоже не шибко быстрые.
I>Может быть есть у кого какие соображения?
Здравствуйте, icezone, Вы писали:
I>Очень хотелось бы узнать алгортм по которому во многих программах I>окно настроек плавно выезжает вниз/в сторону от основного окна.
I>Может быть есть у кого какие соображения?
Если не пытаться найти универсальное решение и забить на Win95, то может подойти AnimateWindow.
У нее, правда, есть ряд ограничений...
Здравствуйте, Кодт, Вы писали:
Таким образом,
h(t)=H*t/T*(2 — t/T)
у нас все целочисленное (и t и h), поэтому для заданного T можно построить таблицу коэффициентов. Например, для T=10: