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

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

Жанры

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

Jenter Алекс

Шрифт:

Я не буду рассматривать этот способ подробно, поскольку он сильно устарел и очень неудобен. Тем не менее, в приложении DrawImg этот способ реализован наравне с другими.

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

Майкрософт Офис, начиная с версии 8.0 (97) использует новый API с теми же фильтрами.

HRESULT Load(LPCTSTR szFile) {

 HMODULE hModule = g_pMapExtToFilter->LoadFilter(szFile);

 if (NULL == hModule) return E_FAIL;

 struct NameStruct {

DWORD dwHead[2];

char szName[MAX_PATH];

DWORD dwTail[2];

 };

 typedef DWORD (__stdcall *GetFilterInfo_t)

 (DWORD dwVersion, DWORD dwReserved, HGLOBAL *phFilterData, DWORD dwReserved2);

 typedef DWORD (__stdcall *SetFilterPref_t)

(HGLOBAL hFilterData, LPCSTR szOption, LPCSTR szValue, DWORD dwReserved2, DWORD dwReserved1);

 typedef DWORD (__stdcall *ImportGr_t)

(DWORD dwReserved, NameStruct *pFile, ImgInfo *pInfo, HGLOBAL hFilterData);

 GetFilterInfo_t pGetFilterInfo = (GetFilterInfo_t)::GetProcAddress(hModule, "GetFilterInfo");

 SetFilterPref_t pSetFilterPref = (SetFilterPref_t)::GetProcAddress(hModule, "SetFilterPref");

 ImportGr_t pImportGr = (ImportGr_t)::GetProcAddress(hModule, "ImportGr");

 if (NULL == pImportGr) pImportGr = (ImportGr_t)::GetProcAddress(hModule, "ImportGR");

 if (pImportGr) {

NameStruct name = {0};

HGLOBAL hFilterData = NULL;

if (pGetFilterInfo) {

DWORD dwVer = pGetFilterInfo(2, 0, &hFilterData, 0x00170000);

ATLASSERT(2 == dwVer);

if (2 != dwVer) {

::FreeLibrary(hModule);

return E_UNEXPECTED;

}

}

// PB 01/26/2001 Turn off dialogs

if (pSetFilterPref) {

pSetFilterPref(hFilterData, "ShowProgressDialog", "No", 2, 1);

pSetFilterPref(hFilterData, "ShowOptionsDialog", "No", 2, 1);

}

USES_CONVERSION;

::lstrcpynA(name.szName, T2CA(szFile), MAX_PATH);

DWORD dwRet = pImportGr(0, &name, &m_Image, hFilterData);

if (hFilterData) ::GlobalFree(hFilterData);

if (0 != dwRet || NULL == m_Image.hObj) {

::FreeLibrary(hModule);

return E_FAIL;

}

if (OBJ_METAFILE != ::GetObjectType(m_Image.hObj)) {

HGLOBAL hObj = (HGLOBAL)m_Image.hObj;

LPBYTE pObj = (LPBYTE)::GlobalLock(hObj);

m_Image.hObj = ::SetMetaFileBitsEx(::GlobalSize(hObj), pObj);

::GlobalUnlock(hObj);

::GlobalFree(hObj);

}

if (NULL == m_Image.hObj) {

::FreeLibrary(hModule);

return E_FAIL;

}

return S_OK;

 }

 ::FreeLibrary(hModule);

 return E_UNEXPECTED;

}

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

 if (m_Image.hObj) {

::SetMapMode(hdc, MM_ANISOTROPIC);

::SetViewportExtEx(hdc,

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

NULL);

::PlayMetaFile(hdc, m_Image.hObj);

return S_OK;

 }

 return E_UNEXPECTED;

}

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

понимает очень редкие форматы. Например wpg или cdr

Недостатки: Нет никакой гарантии, что на компьютере пользователя будет установлен нужный фильтр.

Способ 7 (Direct3D)

Direct3D версии 8.0 и выше умеет загружать картинки в формате BMP, JPEG, PNG:

#include <d3dx8.h>

HRESULT hr = ::D3DXCreateTextureFromFile(m_pD3DDevice, szFile, &ppTexture);

Достоинства: если вы разрабатываете 3D-приложение, то это наиболее удобный способ создания текстур (D3DXCreateTextureFromFile автоматически создает необходимое количество MipMap уровней).

Недостатки: если вы не разрабатываете 3D-приложение, то этот способ крайне неудобен, так как предназначен для работы с 3D объектами. На входе нужен IDirect3DDevice8 объект, а на выходе получаем IDirect3DTexture8, который очень не просто вывести в hdc.

Не реализован в демонстрационном приложении.

Это все на сегодня. Пока! 

Алекс Jenter [email protected] Duisburg, 2001. Публикуемые в рассылке материалы принадлежат сайту RSDN.
Поделиться:
Популярные книги

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

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

Секретарь лорда Демона

Лунёва Мария
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Секретарь лорда Демона

Жатва душ. Остров мертвых

Сугралинов Данияр
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Жатва душ. Остров мертвых

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

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Служанка. Второй шанс для дракона

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Служанка. Второй шанс для дракона

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

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

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Имперский Курьер. Том 2

Бо Вова
2. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 2

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Наследница долины Рейн

Арниева Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Наследница долины Рейн

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

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

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