gusucode.com > 仿360最新界面的源码程序 > 仿360最新界面的源码程序/仿360新版特性窗口源码/部分源码/360新版特性源码/QPreview/ImageInfo.cpp

    /************************************************************************
模快名:		仿360安全卫士界面
功能:		尚未对模块功能进行描述
完成日期:	2010-10-20
作者:		杨伟峰 Yang Weifeng(Email: 11259500@qq.com)

本代码可以自由使用,但因使用本代码造成的后果,本人不承担任何责任
************************************************************************/

#include "stdafx.h"
#include "ImageInfo.h"
#include <comdef.h>
#include <shlwapi.h>
#include <cassert>

std::auto_ptr<CImageInfo> CImageInfo::sm_inst;

CImageInfo::CImageInfo(void)
{
}

CImageInfo::~CImageInfo(void)
{
	// Release在析构中调用,因为GdiplusShutdown的原因己调用的原因会导致内存崩溃
	// Release();
}

CImageInfo * CImageInfo::Instance()
{
	if(sm_inst.get() == 0)
		sm_inst = auto_ptr<CImageInfo>(new CImageInfo);
	return sm_inst.get();

	/* FOLLOWING CODE WORKS ONLY IN VC7
	if(sm_inst.get() == 0)
	sm_inst.reset(new CMachine);
	return sm_inst.get();
	*/
}

Image* CImageInfo::ImageFromResource(UINT nFile)
{
	Image* pImage = NULL;
	if(m_mpImage.find(nFile) != m_mpImage.end())
	{
		return m_mpImage[nFile];
	}

	pImage = FromResource(nFile);
	if(pImage != NULL)
	{
		m_mpImage[nFile] = pImage;
	}

	return pImage;
}

void CImageInfo::Release()
{
	for(map<UINT, Image*>::iterator ciIter = m_mpImage.begin();
		ciIter != m_mpImage.end(); ciIter++)
	{
		delete ciIter->second;
	}
	m_mpImage.clear();
}

Image* CImageInfo::FromResource( UINT uId )
{
	HMODULE hModule = AfxGetResourceHandle();
	HRSRC hRes = ::FindResource( hModule, MAKEINTRESOURCE(uId), _T("PNG"));
	if( hRes == NULL )
	{
		assert(FALSE);
		return NULL;
	}

	DWORD dwSize = ::SizeofResource( hModule, hRes); 
	if( dwSize == 0 )
	{
		assert(FALSE);
		return NULL;
	}

	HGLOBAL hGlobal = ::LoadResource( hModule, hRes); 
	if( hGlobal == NULL )
	{
		assert(FALSE);
		return NULL;
	}

	LPVOID pBuffer = ::LockResource(hGlobal); 
	if( pBuffer == NULL )
	{
		assert(FALSE);
		::FreeResource(hGlobal); 
		return NULL;
	}


	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
	if(hMem == NULL)
	{
		assert(FALSE);
		::FreeResource(hGlobal); 
		return NULL;
	}

	void* pData = GlobalLock(hMem);
	memcpy(pData, (void *)hGlobal, dwSize);
	GlobalUnlock(hMem);

	Image *pRtImg = NULL;
	IStream* pStream = NULL;
	if(CreateStreamOnHGlobal(hMem, TRUE, &pStream) == S_OK)
	{
		pRtImg = Image::FromStream(pStream, FALSE);
		pStream->Release();
	}

	::FreeResource(hGlobal); 

	return pRtImg;
}