Если кому интересно в прикреплённом файле Анимация Gif.rar находятся исходники. Показ анимированных Gif файлов при помощи функций GDI+ с буферизацией данных и без. Нужно только в окно приложения перетащить мышкой Gif файл. С буферизацией это когда заточено для того чтобы не загружать лишний раз процессор (гонять по сто раз некоторые функции GDI+) а загрузить кадры Gif файла в память приложения и при анимации Гифа пользоватся данными оттуда. (хотя на современных быстрых компьютерах не исключено что это уже не актуально) Для кого это не важно и предназначен второй код без буферизации. В папке "IDA-Gif" лежит файл "IDA-Gif.asm" сделанный при помощи программы IDA. Предназначенный для тех кто просто захочет посмотреть как выглядят функции этого приложения на относительно чистом асемблере. Професионалов прошу сильно не пинать (если что то не так) Кто захочет оптимизировать код буду только рад.
Время задержки фрейма на экране необходимо брать из метаданных GIF. ------------------ В дополнение http://wasm.ru/forum/viewtopic.php?id=41678 и http://www.cyberforum.ru/assembler/thread327796.html цитата из спеки GIF89a:
Andrzej Честно говоря не понял суть вашего замечания Время задержки фрейма у меня узнаётся при помощи тандема функций Код (Text): invoke GdipGetPropertyItemSize, hImag, 5100h, addr pFuncBsize invoke GdipGetPropertyItem, hImag, 5100h, pFuncBsize, addr pPropertyItem Они скорее всего и берут эти метаданные из Гифа Поясните конкретно ваше замечание Почему вас не устраивает именно эта реализация узнавания времени задержки фрейма? Ведь функция GdipGetPropertyItem с параметром 5100h - (PropertyTagFrameDelay) и заточена для этого.
Всё верно. Теперь йа увидел, что тандем функций выдает вектор для всех фреймов, а не значение для одного.
Нашёл одну неприятную особенность у себя в коде. При тестировании я использовал 3 вроде бы обычных "Гифа" и сними всё было визуально хорошо. А потом наткнулся на один "Гиф" (смайлик) и увидел что при отрисовке следующего кадра предыдущий кадр остаётся виден. Потому что смайлики как правило имеют бесцветный фон и через эти бесцветные пиксилы к сожелению остаются видны предыдущие кадры. Я попробывал изменить алгоритм. Я и стирал предыдущий кадр перед отрисовкой следующего кадра, и прятал и делал не видимым, но нечего так и не добился ,потому что анимация шла с мерцанием. Так что в предыдущим коде мне так и не удалось исправить эту проблему. Буду рад если кто поможет или подскажет. Короче пришлось по шаманить. Я обратил внимание что у окна класса "Static" например с файлами формата "ico" таких проблем нет. Мне пришлось внести в код изменения точно подобрать слова не смогу но примерно это так (из "Гифа" идёт перегонка в "Иконку") Не исключено что это извращение, но проблема исчезла (контрол "Static" сам проделывал это чудо действие). Может я не правильно (и скорее всего это именно так) использовал "Static" в предыдущим коде но увы у меня не получается. Если кому надо или просто интересно прикрепляю второй код (там в папке для теста лежит смайлик "Smail.gif") Ради интереса прокрутите этот смайлик в предыдущим коде который находится постом выше и вы увидите разницу.
Исправил одну ошибочку в коде "Gif с буфером" Поэтому кто раньше скачивал файл "Анимация2 Gif.rar" желательно перекачать его