Создание анимированной иконки приложения

Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа 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

Как видите, ничего сложного в анимации иконок нет, но как и в любом другом деле, здесь главное знать меру. Ничего не раздражает больше, чем программа, в которой блестит и моргает все, что только можно и нельзя. А вот красивая анимация, примененная в нужной ситуации, добавит вашим программам привлекательности.

В приложении примеры программ с исходными текстами, демонстрирующие анимированные иконки в заголовке окна и в системном трее.
Теги:
анимация, иконка
Добавлено: 10 Апреля 2018 20:15:14 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...