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

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

Жанры

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

Jenter Алекс

Шрифт:

#include <IImgCtx.h>

HRESULT Load(LPCTSTR szFile) {

 // Create IImgCtx object

 HRESULT hr = ::CoCreateInstance(CLSID_IImgCtx, NULL, CLSCTX_ALL, IID_IImgCtx, (void**)&m_pImage);

 if (SUCCEEDED(hr)) {

// Load URL

USES_CONVERSION;

hr = m_pImage->Load(

T2COLE(szFile), // [in] URL

0 // [in] Flags and preffered color format

);

 }

 return hr;

}

HRESULT DrawImg(HDC hdc, RECT& rcBounds) {

 if (m_pImage) {

// Check download state

DWORD dwState = 0;

HRESULT hr = m_pImage->GetStateInfo(&dwState, NULL, true);

if (SUCCEEDED(hr)) {

if (IMGLOAD_LOADING & dwState) {

// Still loading - wait 50 msec and request again

::DrawText(hdc, _T("Loading, please wait..."), -1, &rcBounds, DT_SINGLELINE);

::Sleep(50);

Invalidate(false);

hr = S_FALSE;

} else if (IMGLOAD_COMPLETE & dwState) {

// Download successfully complete

hr = m_pImage->Draw(

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

&rcBounds // [in] Position and dimensions

);

} else {

// Download failed

hr = E_UNEXPECTED;

}

}

return hr;

 }

 return E_UNEXPECTED;

}

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

правильно работает с прозрачными и анимированными картинками. Понимает URL (даже res:// и sysimage://).

Недостатки: не поддерживает загрузку из IStream. Не умеет загружать файлы синхронно.

ПРИМЕЧАНИЕ

Форматов, распознаваемых этим объектом, может быть меньше, например, если при установке IE4 позьзователь отключил поддержку PNG файлов.

Способ 4 (DirectXTransform)

Не смотря на название, эта технология не имеет ничего общего с DirectX. Зато является частью Internet Explorer, внутри которого даже имется набор простеньких классов, реализующих IDirectDraw для нужд DirectXTransform. Этот способ поддерживает тот же набор форматов, что и предыдущий, более того, для этого используется один и тот же код. Разве что синхронно и на выходе получается IDXSurface объект.

#include <dxtrans.h>

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

 if (m_pDCLock) {

HDC hdcImage = m_pDCLock->GetDC;

// Get the bitmap

HGDIOBJ hObj = ::GetCurrentObject(hdcImage, OBJ_BITMAP);

BITMAP bm = {0};

// Get the size of the bitmap

if (hObj && ::GetObject(hObj, sizeof(BITMAP), &bm)) {

// Draw the image

return ::StretchBlt(hdc, rcBounds.left, rcBounds.top,

rcBounds.right - rcBounds.left, rcBounds.bottom - rcBounds.top,

hdcImage, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY

) ? S_OK : E_FAIL;

}

 }

 return E_UNEXPECTED;

}

HRESULT Load(LPCTSTR szFile) {

 CComPtr<IDXTransformFactory> pTransFact;

 CComPtr<IDXSurfaceFactory> pSurfFact;

 // Create the Transform Factory.

 HRESULT hr = ::CoCreateInstance(CLSID_DXTransformFactory, NULL,

CLSCTX_INPROC, IID_IDXTransformFactory, (void **)&pTransFact);

 if (SUCCEEDED(hr))

 hr = pTransFact->QueryService(SID_SDXSurfaceFactory,

IID_IDXSurfaceFactory, (void **)&pSurfFact);

 if (SUCCEEDED(hr)) {

CComBSTR bstrFile(szFile);

CComPtr<IDXSurface> pDXSurf;

// Load DX surface.

hr = pSurfFact->LoadImage(bstrFile, NULL, NULL,

NULL, IID_IDXSurface, (void**)&pDXSurf);

if (SUCCEEDED(hr)) {

// Get IDXDCLock object

hr = pDXSurf->LockSurfaceDC(NULL, INFINITE, DXLOCKF_READ, &m_pDCLock);

}

 }

 return hr;

}

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

Прост в использовании. Поддерживает загрузку из IStream.

Недостатки: Медленный и ресурсоемкий. Это связянно с тем, что сначала для картинки создается обертка в виде IDirectDrawSurface, а затем еще одна для IDXSurface, которые нам совершенно не нужны.

Способ 5 (Фильтры импорта)

Многие программы (например PaintBrush или WinWord) при инсталляции кладут в каталог %ProgramFiles%\Common Files\Microsoft Shared\Grphflt некоторое количество файлов, предназначенных для чтения файлов картинок. Способ не документированный и сильно устаревший. Полный список установленных в системе фильтров находится в реестре по адресу SOFTWARE\\Microsoft\\Shared Tools\\Graphics Filters\\Import

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

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

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

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

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

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

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста