FAQ:WinAPI VCPP:отобразить картинку из файла в IPicture
Материал из Весельчак У
Версия от 22:14, 3 октября 2009; RXL (обсуждение | вклад)
Как при помощи IPicture отобразить картинку из файла?
Пример - несложная функция, отображающая картинку из файла. Поддерживаются форматы BMP, GIF, JPEG, PNG, TIFF, EMF.
#include "atlconv.h" #define HandleIsValid(H) (H != (HANDLE) - 1 && H != (HANDLE)0) // *pDestDC - CDC, на который предполагается вывод картинки // pchzFilePath - путь к файлу // pWid - (возвращает) ширина картинки // pHig - (возвращает) высота картинки bool DrawBitmapFromFile(CDC* pDestDC, const char* pchzFilePath, int *pWid = 0, int *pHig = 0) { bool result = false; if (pWid) *pWid = 0; if (pHig) *pHig = 0; int Wid = 0; int Hig = 0; IPicture* pPic = 0; try { IPicture* ptmpPic = 0; USES_CONVERSION; HRESULT hr; CString txt = pchzFilePath; hr = ::OleLoadPicturePath( const_cast<LPOLESTR>(T2COLE(txt)), 0, 0, 0, IID_IPicture, reinterpret_cast<void **>(&ptmpPic) ); if (hr == S_OK && ptmpPic) pPic = ptmpPic; else throw 0; OLE_XPOS_HIMETRIC cxSrc; OLE_YPOS_HIMETRIC cySrc; if (S_OK != pPic->get_Width(&cxSrc)) throw 0; if (S_OK != pPic->get_Height(&cySrc)) throw 0; Wid = cxSrc / 26; Hig = cySrc / 26; // рисуем if (S_OK != pPic->Render(pDestDC->GetSafeHdc(), 0, Hig, Wid, -Hig, 0, 0, cxSrc, cySrc, 0)) { throw 0; } } catch (...) { result = false; } if (pPic) { pPic->Release(); pPic = 0; } if (pWid) *pWid = Wid; if (pHig) *pHig = Hig; return result; }