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

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

Жанры

Программирование на 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

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

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

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

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

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

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

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

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад