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

ЖАНРЫ

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

Jenter Алекс

Шрифт:

 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 jenter@rsdn.ru Duisburg, 2001. Публикуемые в рассылке материалы принадлежат сайту RSDN.

Программирование на Visual C++

Выпуск №60 от 20 января 2002 г.

Здравствуйте, дорогие подписчики!

Рад снова вас приветствовать на страницах рассылки.

Эх, меняются времена. Сейчас объем статей становится настолько большим, что они редко просто влезают в ограниченный 60 килобайтами выпуск без разбивания на две части. А когда все-таки влезают, то ни для чего другого места больше не остается ;-) Но я думаю, хорошие статьи все-таки для читателей важнее. Сегодня я предлагаю вам познакомиться с очередной концепцией новой платформы .NET – т.н. сборками.

СТАТЬЯ 

Немного о сборках

Автор: Алексей Дубовцев

Source.zip – 1.3 KB

Вводные положения

При проектировании платформы .NET одной из задач являлось легкое развёртывание (инсталляция) и поддержка приложений, так как в настоящее время эта проблема стала серьезно беспокоить не только разработчиков, но и рядовых пользователей. Наверное, каждый знаком с ситуацией, когда после установки новой программы некоторые старые приложения наотрез отказывались работать. Ниже я вам поведаю о том, какое решение данной проблемы предоставила Microsoft на этот раз.

Немного истории

Все началось очень давно, когда Microsoft еще только задумывалась над идеей повторного использования кода. В те времена для решения данной проблемы были созданы динамически подгружаемые библиотеки (Dynamic-Link Load Library, DLL). Они позволяли "выносить" часто используемый код в отдельные библиотеки, которые могли использовать любые приложения. Проблема была в том, что DLL изначально не предоставляли никаких средств управлениям версиями, тогда об этом просто никто не задумывался. Впоследствии Microsoft ввела Version Info (информацию о версии), которая помещалась в DLL как ресурс. Но это не решало проблему полностью, а лишь позволяло определять версию библиотеки, то есть отчасти гарантировало, что будет использоваться именно нужная библиотека. И никак не разъясняло вопрос о том, что делать, если версия библиотеки не совпадает с требуемой. К тому же, вся поддержка версий ложилась на плечи программиста. Для того чтобы корректно поддерживать старые версии, приходилось в уже новых библиотеках оставлять все старые функции, которые и поныне используются старыми приложениями. К примеру, в так называемом ядре Windows – библиотеке Kernel32.dll (которая, по сути, ядром-то и не является), присутствуют многие устаревшие функции, которые в настоящее время используются только устаревшими приложениями, но оставлены для совместимости (WinExec и др.).

Поделиться с друзьями: