Простейшее окно с анимированной иконкой и анимированным курсором

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 16 сен 2026 в 01:52.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.288
    Есть ли идеи? С чего начать? Что следует посмотреть? Существует ли редактор, который перегонит gif-файл в иконку или курсор? Достаточно ли просто найти анимированную иконку/курсор и присоединить ее при помощи LoadCursorFromFile к WC структуре и вызвать RegisterClassEx? Или нужны еще какие-то пляски с бубном?
     
    Последнее редактирование: 16 сен 2026 в 02:06
  2. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.027
    Надеюсь поможет, надо проверять на пракике:

    --- ---


    Анимированный курсор: всё проще, чем кажется


    Вы почти правы. Последовательность действий для курсора действительно проста:
    1. Конвертируйте: Возьмите ваш GIF и превратите его в формат .ani.
    2. Загрузите: Используйте LoadCursorFromFile() для получения хэндла.
    3. Примените: Передайте этот хэндл в поле hCursor структуры WNDCLASSEX перед вызовом RegisterClassEx().
    --- ---

    Анимированная иконка: нужен «костыль».

    Здесь есть важный нюанс. Стандартные поля hIcon и hIconSm ожидают статическую иконку (.ico). Если вы попытаетесь передать туда .ani, система, скорее всего, просто покажет первый кадр или ничего-6-12.
    Чтобы сделать иконку анимированной, нужно самостоятельно управлять её отрисовкой:
    1. Загрузите несколько статических иконок (HICON) в массив.
    2. Создайте таймер (SetTimer).
    3. В обработчике WM_TIMER меняйте текущую иконку окна, отправляя сообщение WM_SETICON.
    --- ---

    1. Использование библиотеки Clickgen.
    Эта библиотека специально создана для сборки курсоров (включая Windows .ani) и абстрагирует всю работу с форматом.

    pip install clickgen

    2. Подготовка кадров:
    Вам нужно сначала разбить ваш GIF на отдельные PNG-файлы (по одному на каждый кадр). Это можно сделать любым удобным способом (например, через Pillow или онлайн-конвертер). Пусть они лежат в папке frames/ с именами типа frame-001.png, frame-002.png и т.д.

    3. Скрипт конвертации:
    Код (Text):
    1. from glob import glob
    2. from clickgen.parser import open_blob
    3. from clickgen.writer import to_win
    4.  
    5. # 1. Собираем пути ко всем PNG-кадрам
    6. fnames = sorted(glob("frames/*.png"))
    7.  
    8. # 2. Читаем файлы как бинарные данные
    9. pngs = []
    10. for f in fnames:
    11.     with open(f, "rb") as p:
    12.         pngs.append(p.read())
    13.  
    14. # 3. Создаем объект курсора.
    15. # hotspot — это координаты "горячей точки" (x, y), которую система считает точкой клика.
    16. # Для стрелки это обычно (0, 0), для других курсоров нужно подбирать.
    17. cur = open_blob(pngs, hotspot=(0, 0))
    18.  
    19. # 4. Конвертируем в формат Windows
    20. # 'to_win' возвращает кортеж: (расширение_файла, бинарные_данные)
    21. ext, result = to_win(cur.frames)
    22.  
    23. # 5. Сохраняем результат
    24. output_filename = f"my_cursor{ext}"
    25. with open(output_filename, "wb") as o:
    26.     o.write(result)
    27.  
    28. print(f"Готово! Файл сохранен как {output_filename}")
    Самая важная часть в коде — параметр hotspot в функции open_blob. Это координаты (x, y) внутри картинки, которые Windows будет считать «острием» курсора. Если поставить их неправильно (например, для курсора-руки поставить в левый верхний угол), то при клике система будет думать, что вы кликаете не туда, куда указывает курсор.
    Для простой стрелки обычно подходит (0, 0), но в некоторых случаях (например, если у вас есть прозрачные поля вокруг рисунка) их нужно подбирать вручную.

    --- ---

    Чем еще можно конвертировать GIF в ANI?

    С конвертацией GIF в .ani проблем нет, есть несколько путей:
    • Онлайн-сервисы: Самый быстрый вариант. Например, iotools.cloud позволяет загрузить GIF, выбрать размер, задать «горячую точку» (hotspot) и скачать готовый .ani-4.
    • Специализированный софт: AniTuner — бесплатная программа для Windows, умеет создавать и редактировать .ani из GIF, AVI или набора картинок-14.
    • Steam: Simple Cursor Maker — платная, но удобная утилита в Steam, которая конвертирует GIF/PNG в .ani и позволяет сразу собрать установочный пакет-7.
    --- ---
     
    Mikl___ нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.288
    Application, спасибо :good3:
    Нашел статью у Manhanter'a Создание анимированной иконки приложения Там он загружает 8 иконок,
    Код (ASM):
    1.   .wminitdialog: invoke  LoadIcon,[hInstance],1; Загрузить иконку    
    2.         invoke  SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax; Установить иконку окна    
    3.         invoke  SetTimer,[hwnddlg],1,100,NULL; Установить таймер обновления иконки
    4.         mov     [nIcon],1
    5.         jmp     .processed
    6.   .animate: inc     [nIcon]; Анимация иконки окна
    7.         cmp     [nIcon],8
    8.         jbe     @f    
    9.         mov     [nIcon],1; Перейти к первому кадру
    10.   @@:   invoke  LoadIcon,[hInstance],[nIcon]; Загрузить следующую иконку    
    11.         invoke  SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax; Обновить иконку окна
    12.         jmp     .processed
     
    Последнее редактирование: 16 сен 2026 в 04:15
    Application нравится это.