Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программирование » Программирование на Visual C++. Архив рассылки - Алекс Jenter

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

Читать онлайн Программирование на Visual C++. Архив рассылки - Алекс Jenter

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 117 118 119 120 121 122 123 124 125 ... 156
Перейти на страницу:

 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 FilesMicrosoft SharedGrphflt некоторое количество файлов, предназначенных для чтения файлов картинок. Способ не документированный и сильно устаревший. Полный список установленных в системе фильтров находится в реестре по адресу SOFTWARE\Microsoft\Shared Tools\Graphics Filters\Import

Я не буду рассматривать этот способ подробно, поскольку он сильно устарел и очень неудобен. Тем не менее, в приложении 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.

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

ПРИМЕЧАНИЕ

Вы сможете найти список всех таких функций в Platform SDK на странице Obsolete Windows Programming Elements.

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

Вторым шагом было создание COM, который уже предусматривал поддержу версий как неотъемлемую свою часть. Вся поддержка версий в COM в основном основывалась на регистрации приложений и компонентов COM в системном реестре. Что, как позже выяснилось, было далеко не гениальным решением. Поддержка совместимости версий все еще была возложена на плечи разработчика, что само по себе не подразумевало решения проблемы. Ведь что взбредет в голову простому разработчику – одному господу богу известно. Захочет он поддерживать старые версии, или нет, – это его личный выбор. От которого, кстати, будут очень зависеть пользователи. Кроме того, все эти записи о версиях в реестре оказались достаточно неэффективными, так как на практике не были защищены от внешних воздействий (скажем, от установки нового приложения). Порой эти записи повреждались, что было фатальным, и приходилось заново переустанавливать приложения, так и не зная реальной причины их краха.

1 ... 117 118 119 120 121 122 123 124 125 ... 156
Перейти на страницу:
На этой странице вы можете бесплатно скачать Программирование на Visual C++. Архив рассылки - Алекс Jenter торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит