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

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

Жанры

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

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

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Баоларг

Кораблев Родион
12. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Баоларг

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

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

Мастер 6

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

Хозяйка старой усадьбы

Скор Элен
Любовные романы:
любовно-фантастические романы
8.07
рейтинг книги
Хозяйка старой усадьбы

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Двойник Короля

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

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Дикая фиалка заброшенных земель

Рейнер Виктория
1. Попаданки рулят!
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Дикая фиалка заброшенных земель