Создание анимированной иконки приложения
Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.
Кадры для анимации
В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
Code (Assembler) : Убрать нумерацию
- resource group_icons,\
- 1,LANG_NEUTRAL,animate1,\
- 2,LANG_NEUTRAL,animate2,\
- 3,LANG_NEUTRAL,animate3,\
- 4,LANG_NEUTRAL,animate4,\
- 5,LANG_NEUTRAL,animate5,\
- 6,LANG_NEUTRAL,animate6,\
- 7,LANG_NEUTRAL,animate7,\
- 8,LANG_NEUTRAL,animate8
- resource icons,\
- 1,LANG_NEUTRAL,icon_data1,\
- 2,LANG_NEUTRAL,icon_data2,\
- 3,LANG_NEUTRAL,icon_data3,\
- 4,LANG_NEUTRAL,icon_data4,\
- 5,LANG_NEUTRAL,icon_data5,\
- 6,LANG_NEUTRAL,icon_data6,\
- 7,LANG_NEUTRAL,icon_data7,\
- 8,LANG_NEUTRAL,icon_data8
- icon animate1,icon_data1,'icon1.ico'
- icon animate2,icon_data2,'icon2.ico'
- icon animate3,icon_data3,'icon3.ico'
- icon animate4,icon_data4,'icon4.ico'
- icon animate5,icon_data5,'icon5.ico'
- icon animate6,icon_data6,'icon6.ico'
- icon animate7,icon_data7,'icon7.ico'
- icon animate8,icon_data8,'icon8.ico'
Первый вариант - анимация иконки в заголовке окна. Иконка в заголовок окна устанавливается и изменяется при помощи функции LoadIcon и сообщения WM_SETICON, отправляемого окну. А для смены кадров установим таймер, интервал определяется опытным путем. В моем примере установка первого кадра анимации и запуск таймера происходит на этапе инициализации окна:
Code (Assembler) : Убрать нумерацию
- ; Загрузить иконку с первым кадром
- invoke LoadIcon,[hInstance],1
- ; Установить иконку окна
- invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax
- ; Установить таймер обновления иконки
- invoke SetTimer,[hwnddlg],1,100,NULL
- ; Текущий первый кадр
- mov [nIcon],1
Code (Assembler) : Убрать нумерацию
- ; Увеличить номер текущего кадра
- inc [nIcon]
- ; Обработали полный цикл? (в нашем случае это 8 кадров)
- cmp [nIcon],8
- jbe @f
- ; Перейти к первому кадру
- mov [nIcon],1
- @@:
- ; Загрузить следующую иконку
- invoke LoadIcon,[hInstance],[nIcon]
- ; Обновить иконку окна
- invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax
Code (Assembler) : Убрать нумерацию
- ; Загрузить иконку
- invoke LoadIcon,[hInstance],1
- ; Установить иконку окна
- invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax
- ; Заполнить структуру иконки в трее
- mov [node.cbSize],sizeof.NOTIFYICONDATA
- mov eax,[hwnddlg]
- mov [node.hWnd],eax
- mov [node.uID],NULL
- mov [node.uFlags],NIF_ICON
- mov [node.uCallbackMessage],NULL
- ; Загрузить первый кадр
- invoke LoadIcon, [hInstance], 1
- mov [node.hIcon],eax
- ; Показать иконку в трее
- invoke Shell_NotifyIcon, NIM_ADD,node
- ; Установить таймер обновления иконки
- invoke SetTimer,[hwnddlg],1,100,NULL
- ; Текущий первый кадр
- mov [nIcon],1
Code (Assembler) : Убрать нумерацию
- ; Увеличить номер текущего кадра
- inc [nIcon]
- ; Обработали полный цикл? (в нашем случае это 8 кадров)
- cmp [nIcon],8
- jbe @f
- ; Перейти к первому кадру
- mov [nIcon],1
- @@:
- ; Загрузить следующую иконку
- invoke LoadIcon, [hInstance], [nIcon]
- mov [node.hIcon],eax
- ; Обновить иконку в трее
- invoke Shell_NotifyIcon,NIM_MODIFY,node
В приложении примеры программ с исходными текстами, демонстрирующие анимированные иконки в заголовке окна и в системном трее.
Просмотров: 10343 | Комментариев: 14
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Андрей
(05.09.2020 в 23:50):
Ага, понял. Спасибо. Заточка кода под универсальность.
ManHunter
(05.09.2020 в 23:43):
Потому что получится очень частный случай, пусть и красиво реализованный. А если иконок будет не 8, а 5 или 19?
Андрей
(05.09.2020 в 23:38):
Доброго дня.
Вопрос. Почему бы цикл
inc [nIcon] ; Увеличить номер текущего кадра
cmp [nIcon],8 ; Обработали полный цикл?
jbe @f ; Перейти к первому кадру
mov [nIcon],1
@@:
Не заменить на
and [nIcon],7 ; от 0 до 7
inc [nIcon] ; +1
Вопрос. Почему бы цикл
inc [nIcon] ; Увеличить номер текущего кадра
cmp [nIcon],8 ; Обработали полный цикл?
jbe @f ; Перейти к первому кадру
mov [nIcon],1
@@:
Не заменить на
and [nIcon],7 ; от 0 до 7
inc [nIcon] ; +1
Михаил
(26.12.2011 в 22:03):
ну спасибо тогда хоть за пример и за внимание )))
ManHunter
(26.12.2011 в 21:35):
Идешь на сайт людей, которые пишут на masm и задаешь подобные вопросы там. Я на masm не пишу и разбираться с ним не собираюсь.
Михаил
(26.12.2011 в 21:09):
Здравствуйте,чуток не туда написал ))) , вопросик таков , написал программу по Вашему примеру , откомпилировал в FASM работает нормально , попытался в Masm'е не работает , я понимаю что синтаксис разный я его изменил то , но в масме нету библиотеки win32a.inc , не подскажите как решить проблему ? собственно нужно в масме создать подобную программу , которая одновременно выполняет анимацию иконки и в оглавлении программы и в панели задач и в трее.
и существует ли какойто конвертер синтаксиса fasm2masm? или можно допустим имея exe исполяемый файл декомпилировать его в исходный код на масме?
и существует ли какойто конвертер синтаксиса fasm2masm? или можно допустим имея exe исполяемый файл декомпилировать его в исходный код на масме?
ManHunter
(21.10.2011 в 21:14):
На сайте есть отдельная статья про иконки разных размеров
Глеб
(21.10.2011 в 20:04):
Здравствуйте, вопрос немного не по теме, но всё же:
Как назначить приложению группу иконок,
что бы активная зависела от вида в проводнике
(таблица/список-16х16(ico1), значки-32х32(ico2)... ),
а то у меня одна иконка на все виды.
Как назначить приложению группу иконок,
что бы активная зависела от вида в проводнике
(таблица/список-16х16(ico1), значки-32х32(ico2)... ),
а то у меня одна иконка на все виды.
semiono
(02.10.2010 в 22:05):
Замечал, что в приложениях ресурсы расположенны примерно так
1=ico_64x64, 2=ico_48x48, 3=ico_32x32, 4=ico_16x16.
У меня же изначально сложилась привычка разполагать в обратном порядке.
Хочу спросить, есть ли правила, или это вообще не имеет значения?
1=ico_64x64, 2=ico_48x48, 3=ico_32x32, 4=ico_16x16.
У меня же изначально сложилась привычка разполагать в обратном порядке.
Хочу спросить, есть ли правила, или это вообще не имеет значения?
ManHunter
(27.08.2010 в 00:20):
Можно наложить на иконки в проводнике свои иконки (например, так Tortoise SVN помечает файлы в проекте). Наверное, если это делать в цикле, то можно добиться некоего подобия анимации. Но для этого контролирующая программа должна постоянно висеть в памяти.
semiono
(27.08.2010 в 00:14):
Возможно глупый вопрос, а возможно зделать анимацию в проводнике?
Или это уже зависит от самого explorer и прога тут нипричём?
Или это уже зависит от самого explorer и прога тут нипричём?
semiono
(17.08.2010 в 17:28):
24 бита помоему не поддерживаются, я как-то уже имел дело...
ManHunter
(26.04.2010 в 17:49):
Ну не обязательно же делать в анимации все 8 кадров, можно поменьше. Да и цветность можно выбрать другую, не 32 бита. Так что пути сокращения размера всегда есть :)
Zummenix
(26.04.2010 в 17:46):
Иконки места много занимают :), а так прикольно, пригодится.
Добавить комментарий
Заполните форму для добавления комментария