Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.
Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.
В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
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, отправляемого окну. А для смены кадров установим таймер, интервал определяется опытным путем. В моем примере установка первого кадра анимации и запуск таймера происходит на этапе инициализации окна:
; Загрузить иконку с первым кадром
invoke LoadIcon,[hInstance],1
; Установить иконку окна
invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax
; Установить таймер обновления иконки
invoke SetTimer,[hwnddlg],1,100,NULL
; Текущий первый кадр
mov [nIcon],1
В вашем случае это может быть какое-нибудь другое событие, предусмотренное программой. Обработчик сообщения от таймера выглядит так:
; Увеличить номер текущего кадра
inc [nIcon]
; Обработали полный цикл? (в нашем случае это 8 кадров)
cmp [nIcon],8
jbe @f
; Перейти к первому кадру
mov [nIcon],1
@@:
; Загрузить следующую иконку
invoke LoadIcon,[hInstance],[nIcon]
; Обновить иконку окна
invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax
Второй вариант - анимация иконки в системном трее. Ресурсы для этого примера остаются прежними, в код инициализации добавляется создание иконки в трее:
; Загрузить иконку
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
Подразумевается, что структура node описана в сегменте данных как NOTIFYICONDATA. Таймер остается без изменений, меняется только обработчик сообщения от него.
; Увеличить номер текущего кадра
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
Как видите, ничего сложного в анимации иконок нет, но как и в любом другом деле, здесь главное знать меру. Ничего не раздражает больше, чем программа, в которой блестит и моргает все, что только можно и нельзя. А вот красивая анимация, примененная в нужной ситуации, добавит вашим программам привлекательности.
В приложении примеры программ с исходными текстами, демонстрирующие анимированные иконки в заголовке окна и в системном трее.