FAQ:WinAPI VCPP:отобразить картинку из файла в IPicture
Материал из Весельчак У
Как при помощи 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;
}