Использование UpdateLayeredWindow / SetLayeredWindowAttributes

Тема в разделе "WASM.WIN32", создана пользователем TheRawGod, 24 янв 2007.

  1. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    Добрый день,

    у меня появилась необходимость в анамации обычного виндового диалога, надо его подвигать по экрану. Делаю обычный 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 окна для красивой анимации?

    Заранее большое спасибо.
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    >При этом ни в одном ничего само по себе не двигается.

    А как вы это себе представляете ? :)

    Есть еще и AnimateWindow, но кажется, и она вам не подойдет...

    С помощью UpdateLayeredWindow можно устроить движение/трансформацию некоего образа внутри окна,
    к движению же самого окна UpdateLayeredWindow отношения не имеет.
    Конечно, если окно - размером с экран, то (при задействованном ULW_COLORKEY) будет вроде как "движение по экрану", но и с соответствующими тормозами.

    Анимацию на основе UpdateLayeredWindow демонстрирует персонаж-помощник из MS Word 2002,
    а на основе регионов - персонаж-помощник из поиска файлов в XP...
    но ведь вы, кажется, рассчитываете на некий подвесной мотор для окон и диалогов ? :)
     
  3. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    kero

    Ну, туманно написал:) Я имел ввиду, что не пользователь тянет за полосочку скролла, а типа окошко двигается само. Еще правильнее было бы сказать: окошко двигается само по экрану, а не внутри нашего же окошка, как это происхдит в случае со скроллом.

    Вот за это спасибо. Я это уже начал подозревать, но animates its shape из МСДН'a + описание ptDst параметра упомянутой функции сбили с толку.

    Значит получается, что кроме как с помощью SetWindowPos ничего "лучшего" для передвижения моего диалога по всему экрану придумать нельзя?
    А нужно ли тогда мне вообще layered окно?

    Вот тут сам думал, по идее, если как бы отрисовать диалог в битмап, потом подвигать этот битмап по экрану, как нам нужно, а в конце опять отрисовать диалог - должно получится плавнее, чем перемещение всего диалога целиком со всеми его контролами и т.п., ведь верно?
     
  4. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    Сам отвечу на пару своих вопросов:)

    Повозившись и поэкспериментировав выяснил, что стиль WS_EX_LAYERED окну помогает для более корректной отрисовки. Т.е. с этим стилем и нулевой прозрачностью окошко перемещается красивее, чем без этого стиля. Сами окошки для двух случаев при нулевой прозрачности ес-но выглядят идентично.

    Второе. Опять же, догадка оправдалась. Наиболее красиво перемещать получается, если отрисовывать диалог в картинку, сам диалог спрятать, а перемещать уже эту самую картинку. В конце вместо картинки опять показать дилог.