Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:
Способ 1 (OleLoadPicture)

Самый "официальный" способ. Появился вместе с OLE32 и работает до сих пор. Функции OleLoadPicture(Ex) и OleLoadPicturePath умеют загружать картинки в формате BMP, GIF, JPEG, ICO, WMF, и EMF:

#include <olectl.h>

HRESULT Load(LPCTSTR szFile) {

 CComPtr<IStream> pStream;

 // Load the file to a memory stream

 HRESULT hr = FileToStream(szFile, &pStream);

 if (SUCCEEDED(hr)) {

// Decode the picture

hr = ::OleLoadPicture(

pStream, // [in] Pointer to the stream that contains picture's data

0, // [in] Number of bytes read from the stream (0 == entire)

true, // [in] Loose original format if true

IID_IPicture, // [in] Requested interface

(void**)&m_pPicture // [out] IPictire object on success

);

 }

 return hr;

}

HRESULT DrawImg(HDC hdc, const RECT& rcBounds) {

 if (m_pPicture) {

// Get the width and the height of the picture

long hmWidth = 0, hmHeight = 0;

m_pPicture->get_Width(&hmWidth);

m_pPicture->get_Height(&hmHeight);

// Convert himetric to pixels

int nWidth = MulDiv(hmWidth, ::GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);

int nHeight = MulDiv(hmHeight, ::GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);

// Display the picture using IPicture::Render

return m_pPicture->Render(

hdc, // [in] Handle of device context on which to render the image

rcBounds.left, // [in] Horizontal position of image in hdc

rcBounds.top, // [in] Vertical position of image in hdc

rcBounds.right - rcBounds.left, // [in] Horizontal dimension of destination rect.

rcBounds.bottom - rcBounds.top, // [in] Vertical dimension of destination rect.

0, // [in] Horizontal offset in source picture

hmHeight, // [in] Vertical offset in source picture

hmWidth, // [in] Amount to copy horizontally in source picture

– hmHeight, // [in] Amount to copy vertically in source picture

&rcBounds // [in, optional] Pointer to position of destination for a metafile hdc

);

 }

 return E_UNEXPECTED;

}

Достоинства:

правильно работает с прозрачными картинками.

Недостатки: не поддерживает анимированный GIF (см. также CPicturEx). Не поддерживает PNG.

Способ 2 (GDI+)

Недостаток ::LoadImage с лихвой исправили в GDI+. Объект Gdiplus::Image умеет загружать картинки в формате bmp, gif, jpeg, png, TIFF, EXIF, WMF, и EMF:

#include <gdiplus.h>

HRESULT Load(LPCTSTR szFile) {

 USES_CONVERSION;

 // Create new Gdiplus::Image object

 m_pImage = new Gdiplus::Image(T2CW(szFile));

 ATLASSERT(m_pImage);

 // Check for success

 if (Gdiplus::Ok == m_pImage->GetLastStatus) return S_OK;

 // Cleanup on failure

 Destroy;

 return E_FAIL;

}

HRESULT DrawImg(HDC hdc, RECT& rcBounds) {

 if (m_pImage) {

// Create Gdiplus::Graphics object from HDC

Gdiplus::Graphics graphics(hdc);

// Create Gdiplus::Rect object from RECT

Gdiplus::Rect rc(rcBounds.left, rcBounds.top, rcBounds.right, rcBounds.bottom);

// Draw the image

return Gdiplus::Ok == graphics.DrawImage(

m_pImage, // [in] Gdiplus::Image object

rc // [in] Position and dimensions

) ? S_OK : E_FAIL;

 }

 return E_UNEXPECTED;

}

Достоинства: понимает множество форматов, в том числе анимированный GIF, правильно работает с прозрачными картинками.

Недостатки: На сегодняшний момент реализован только в WindowsXP. Хотя простое копирование gdiplus.dll в system32 делает ее доступной, как минимум, в Windows2000. Скорее всего, в обозримом будущем ожидаются версии и для Win9x.

Способ 3 (IImgCtx)

Не так давно Майкрософт предоставила заголовочные и библиотечные файлы к объекту ImgCtx, появившемуся еще в internet explorer 4.0. Он умеет заргужать картинки в формате BMP, GIF, JPEG, ICO, WMF, EMF, PNG, XBM, ICO, TIFF и, возможно, некоторых других:

Поделиться:
Популярные книги

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Неудержимый. Книга XXVI

Боярский Андрей
26. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVI

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Седьмой Рубеж IV

Бор Жорж
4. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж IV

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Назад в ссср 6

Дамиров Рафаэль
6. Курсант
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в ссср 6

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

Княжна попаданка. Последняя из рода

Семина Дия
1. Княжна попаданка. Магическая управа
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Княжна попаданка. Последняя из рода

Отверженный IX: Большой проигрыш

Опсокополос Алексис
9. Отверженный
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Отверженный IX: Большой проигрыш

Город Богов 3

Парсиев Дмитрий
3. Профсоюз водителей грузовых драконов
Фантастика:
юмористическое фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Город Богов 3

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца