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;
}