Сообщений 13    Оценка 151 [+1/-0]         Оценить  
Система Orphus

Класс CPictureEx

Автор: Олег Быков
The RSDN Group
Опубликовано: 07.08.2001
Исправлено: 13.03.2005
Версия текста: 1.0

Исходные тексты класса (10k)

Демонстрационный проект (173k)


Класс CPictureEx был написан мной для MFC-проекта, в котором требовалось реализовать показ баннеров форматов GIF и JPG. Если для обычных (статичных) картинок проблема без труда решалась использованием функции OleLoadPicture и интерфейса IPicture (прием, впервые увиденный мной на CodeProject), то с анимированными GIF'ами дело обстояло куда сложнее.

Усиленный поиск по Интернет-ресурсам показал, что из свободно доступных решений существовал только представленный на CodeGuru COM-объект, который к тому же некорректно отображал часть GIF'ов из моего тестового набора. Был вариант купить библиотеку сторонних разработчиков, но в этом случае я получал в свое распоряжение совершенно ненужную мне дополнительную функциональность. Я решил сделать все сам. Основная идея состояла в том, чтобы разделить GIF на отдельные кадры, и уже эти кадры показывать через знакомую связку OleLoadPicture/IPicture. В результате тщательного изучения спецификаций GIF87a и GIF89a на свет появился код, который я предлагаю вашему вниманию. Отмечу еще раз, что класс CPictureEx может показывать не только анимированные GIF'ы, но и обычные GIF, а также JPEG, BMP, WMF, ICO и CUR (то есть, все то, что знает OleLoadPicture).

Для использования класса проделайте следующие шаги:

  • добавьте в шаблон вашего диалога элемент Static text или Picture (сойдет и Group box);
  • измените идентификатор добавленного элемента, например, на IDC_MYPICTURE;
  • с помощью ClassWizard'а сопоставьте с этим элементом Member variable (допустим m_Picture), Category - Control, Variable type - CStatic;
  • замените в заголовочном файле вашего диалога тип добавленной переменной с CStatic на CPictureEx;
  • в OnInitDialog (на самом деле, где вам будет угодно) добавьте строки
    if (m_Picture.Load(_T("mypicture.gif")))
        m_Picture.Draw();
  • наслаждайтесь анимацией :)
  • Функция CPictureEx::Load доступна в трех вариантах:

        BOOL Load(LPCTSTR szFileName);

    Этот вариант загружает картинку из файла с указанным именем. Возвращаемое значение сигнализирует об успехе операции.

        BOOL Load(HGLOBAL hGlobal, DWORD dwSize);

    Функции передается адрес глобальной памяти, выделенной функцией GlobalAlloc. Этот вариант Load не освобождает переданную память, так что об этом должны позаботиться вы сами. Возвращаемое значение указывает на успех операции.

        BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);

    Функции передается имя ресурса, содержащего картинку и имя типа этого ресурса. Пример использования:

        m_Picture.Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));

    После того, как картинка загружена, вы можете нарисовать ее функцией CPictureEx::Draw(). Если картинка представляет собой анимированный GIF, то функция запустит поток, отвечающий за анимацию, если нет, то картинка передается OleLoadPicture. Остановить запущенный поток можно в любой момент функцией CPictureEx::Stop(). Если нужно не только остановить картинку, но и освободить все занятые ей ресурсы, воспользуйтесь CPictureEx::UnLoad() (CPictureEx::Load() вызывает UnLoad() автоматически).

    По умолчанию фон картинки заливается COLOR_3DFACE (фоновый цвет диалоговых окон). Если фоновый цвет нужно изменить, вызовите CPictureEx::SetBkColor(COLORREF) после CPictureEx::Load().


    Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
        Сообщений 13    Оценка 151 [+1/-0]         Оценить