Добрый день, у меня появилась необходимость в анамации обычного виндового диалога, надо его подвигать по экрану. Делаю обычный SetWindowPos - и в общем-то приемлемо движется, особенно если из отдельного потока двигать. В этот момент мне приходит сообщение в гмейле и внизу справа вылазит красивый popup. После чего я понимаю, что мое окошко двигается явно не приемлемо Поиски по нету привели к тому, что надо использовать т.н. layered окна. Лезу в МСДН, там написано следующее: "Using a layered window can significantly improve performance and visual effects for a window that has a complex shape, animates its shape, or wishes to use alpha blending effects". Вывод: то что мне нужно. Смотрю примеры из МСДН, их там 2: первый использует SetLayeredWindowAttributes. У меня работает. Но устанавливаемые атрибуты касаются лишь прозрачности окна. Если после этого делать тот же SetWindowPos, то, честно говрворя, особой разницы по сравнению с использованием не layered окна я не заметил. Второй пример из МСДН использует UpdateLayeredWindow, но мне его повторить не удается Ищу в сети. Нахожу несколько красивых примеров, в т.ч. на васме, но все они показывают как делать окошко из кастомных картинок. Типа странной формы, со всякими безумными контролами, прозрачностью и т.д. При этом ни в одном ничего само по себе не двигается. Мне же надо отобразить свой, обычный виндовый диалог, только с плавной анимацией. Отсюда пару вопросов: правильно ли я копаю (т.е. способна ли UpdateLayeredWindow двигать мое окошко в заданное место на экране)? Если способна, то можно пример простейшего способа это сделать, без всякой прозрачности, чтобы мне просто переместить окно с известным хендлом с помощью UpdateLayeredWindow. Если же не способна, то какие еще есть варианты для "красивой" анимации обычных виндовых дилогов, кроме SetWindowPos? И помогут ли мне эти самые layered окна для красивой анимации? Заранее большое спасибо.
>При этом ни в одном ничего само по себе не двигается. А как вы это себе представляете ? Есть еще и AnimateWindow, но кажется, и она вам не подойдет... С помощью UpdateLayeredWindow можно устроить движение/трансформацию некоего образа внутри окна, к движению же самого окна UpdateLayeredWindow отношения не имеет. Конечно, если окно - размером с экран, то (при задействованном ULW_COLORKEY) будет вроде как "движение по экрану", но и с соответствующими тормозами. Анимацию на основе UpdateLayeredWindow демонстрирует персонаж-помощник из MS Word 2002, а на основе регионов - персонаж-помощник из поиска файлов в XP... но ведь вы, кажется, рассчитываете на некий подвесной мотор для окон и диалогов ?
kero Ну, туманно написал Я имел ввиду, что не пользователь тянет за полосочку скролла, а типа окошко двигается само. Еще правильнее было бы сказать: окошко двигается само по экрану, а не внутри нашего же окошка, как это происхдит в случае со скроллом. Вот за это спасибо. Я это уже начал подозревать, но animates its shape из МСДН'a + описание ptDst параметра упомянутой функции сбили с толку. Значит получается, что кроме как с помощью SetWindowPos ничего "лучшего" для передвижения моего диалога по всему экрану придумать нельзя? А нужно ли тогда мне вообще layered окно? Вот тут сам думал, по идее, если как бы отрисовать диалог в битмап, потом подвигать этот битмап по экрану, как нам нужно, а в конце опять отрисовать диалог - должно получится плавнее, чем перемещение всего диалога целиком со всеми его контролами и т.п., ведь верно?
Сам отвечу на пару своих вопросов Повозившись и поэкспериментировав выяснил, что стиль WS_EX_LAYERED окну помогает для более корректной отрисовки. Т.е. с этим стилем и нулевой прозрачностью окошко перемещается красивее, чем без этого стиля. Сами окошки для двух случаев при нулевой прозрачности ес-но выглядят идентично. Второе. Опять же, догадка оправдалась. Наиболее красиво перемещать получается, если отрисовывать диалог в картинку, сам диалог спрятать, а перемещать уже эту самую картинку. В конце вместо картинки опять показать дилог.