16.09.2023 | Категория:
Образ мышления: Assembler | Автор: ManHunter
Когда-то давно я показывал, как можно реализовать анимацию окна
вручную. Сейчас покажу, как подобная анимация делается штатными функциями Windows, а точнее одной единственной функцией
AnimateWindow. Но сперва некоторое количество констант, которые используются в программе, но про которые не знает FASM.
- AW_HOR_POSITIVE = 0x00000001
- AW_HOR_NEGATIVE = 0x00000002
- AW_VER_POSITIVE = 0x00000004
- AW_VER_NEGATIVE = 0x00000008
- AW_CENTER = 0x00000010
- AW_HIDE = 0x00010000
- AW_ACTIVATE = 0x00020000
- AW_SLIDE = 0x00040000
- AW_BLEND = 0x00080000
Первым параметром функции указывается продолжительность эффекта анимации, вторым - флаг или комбинация флагов, описывающих этот эффект. Флаги
AW_HOR_POSITIVE,
AW_HOR_NEGATIVE,
AW_VER_POSITIVE и
AW_VER_NEGATIVE отвечают, соответственно, за горизонтальное и вертикальное разворачивание окна. Если скомбинировать флаг одного из горизонтальных направлений с флагом одного из вертикальных направлений, то окно будет раскрываться по диагонали. А если к одному из этих флагов добавить
AW_SLIDE, то окно будет как бы выезжать из указанного направления.
AW_BLEND отвечает за эффект прозрачности, что-то подобное я также реализовал
вручную, только тут не надо возиться с
WS_EX_LAYERED и
SetLayeredWindowAttributes, всю грязную работу система берет на себя. При использовании флага
AW_CENTER окно будет разворачиваться из своей центральной точки. Для того, чтобы эффект применялся не для открытия, а для сворачивания окна, к эффектам надо добавлять флаг
AW_HIDE. На практике это выглядит примерно так, вот фрагмент функции обработчика диалогового окна:
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- cmp [msg],WM_CLOSE
- je wmclose
- ...
-
- wminitdialog:
-
- invoke AnimateWindow,[hwnddlg],300,AW_CENTER+AW_ACTIVATE
- ...
- wmclose:
-
- invoke AnimateWindow,[hwnddlg],300,AW_BLEND+AW_HIDE
- ...
Не обошлось и без особенностей. Обычные окна с заголовком при применении к ним функции
AnimateWindow дают необычный эффект: появляется или исчезает только их внутреннее содержимое, а рамка остается неизменной. Поэтому функцию желательно применять к беззаголовочным окнам типа
сплэш-окон, окнам
всплывающих уведомлений, всяким патчам-кейгенам и тому подобным.
Читать статью целиком »
Просмотров: 743 |
Комментариев: 0