VC picture上怎么显示gif文件,并让它实时播放.
解决方案 »
- 发了三四个贴还没解决,索性高分悬赏!!
- 十六进制字符串怎么转换成对应的十六进制数?
- unicode工程中RegSetValueEx的问题
- 请教COleDragDrop如何判断来源?
- 一个关于图象灰度化的错误。
- 强烈要求封杀v5256(51889) 这个家伙的ID.
- 初学者问题:如何看懂一些完整的VC++代码?
- 线程 的简单问题求救. . . 谢谢大家 200分
- 急!!在视图中实现换行问题!!解决问题马上给分。。。
- 做过共享软件的朋友请进,如何用工商银行或农业银行为交易媒介,当用户汇款过来时,我怎么知道是谁汇的款?
- 能不能禁用Microsoft Web Browser控件里的右键功能?
- 控件拖动问题,急~
// Picture.h: interface for the CPicture class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_)
#define AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include "olectl.h"class CPicture
{
public:
CPicture();
virtual ~CPicture(); bool Load(CString sFileName, int cxDesired, int cyDesired);
CSize GetSize(CDC* pDC);
HBITMAP GetHBmp();
void DeleteHBmp();
private:
static bool GetResource(LPSTR lpName, LPSTR lpType, void* pResource, int& nBufSize);
void UnLoad();
bool LoadFromBuffer(BYTE* pBuff, int nSize,
int cxDesired, int cyDesired);
IPicture* m_pPicture;
enum
{
HIMETRIC_INCH = 2540
}; HBITMAP hBB;
};#endif // !defined(AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_)
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "Picture.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CPicture::CPicture()
{
hBB = NULL;
m_pPicture = NULL;
}CPicture::~CPicture()
{
UnLoad();
}bool CPicture::Load(CString sFileName, int cxDesired, int cyDesired)
{
bool bResult = false; if (m_pPicture != NULL)
UnLoad(); if (m_pPicture == NULL)
{
CFile cFile;
CFileException e; if (cFile.Open(sFileName, CFile::modeRead | CFile::typeBinary, &e))
{
BYTE* pBuff = new BYTE[cFile.GetLength()]; if (cFile.Read(pBuff, cFile.GetLength()) > 0)
{
if (LoadFromBuffer(pBuff, cFile.GetLength(),
cxDesired, cyDesired))
bResult = true;
} delete [] pBuff;
}
} return bResult;
}void CPicture::UnLoad()
{
long l; if (m_pPicture != NULL)
{
l = m_pPicture->Release();
m_pPicture = NULL;
}
}bool CPicture::LoadFromBuffer(BYTE* pBuff,
int nSize,
int cxDesired,
int cyDesired)
{
bool bResult = false; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);
void* pData = GlobalLock(hGlobal);
memcpy(pData, pBuff, nSize);
GlobalUnlock(hGlobal); IStream* pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
{
HRESULT hr;
if ((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture)) == S_OK)
{
bResult = true;
}
HBITMAP hB = 0;
m_pPicture->get_Handle((unsigned int*)&hB); // Copy the image. Necessary, because upon p's release,
// the handle is destroyed. if (hBB != NULL)
{
DeleteObject(hBB);
hBB = NULL;
} hBB = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,cxDesired,cyDesired,
LR_COPYDELETEORG); DeleteObject(hB);
hB = NULL; pStream->Release();
} return bResult;
}bool CPicture::GetResource(LPSTR lpName, LPSTR lpType, void* pResource, int& nBufSize)
{
HRSRC hResInfo;
HANDLE hRes;
HMODULE hInst = NULL;
LPSTR lpRes = NULL;
int nLen = 0;
bool bResult = FALSE; // Find the resource
hResInfo = FindResource(hInst, lpName, lpType); if (hResInfo == NULL)
return false; // Load the resource
hRes = LoadResource(hInst, hResInfo); if (hRes == NULL)
return false; // Lock the resource
lpRes = (char*)LockResource(hRes); if (lpRes != NULL)
{
if (pResource == NULL)
{
nBufSize = SizeofResource(hInst, hResInfo);
bResult = true;
}
else
{
if (nBufSize >= (int)SizeofResource(hInst, hResInfo))
{
memcpy(pResource, lpRes, nBufSize);
bResult = true;
}
} UnlockResource(hRes);
} // Free the resource
FreeResource(hRes); return bResult;
}CSize CPicture::GetSize(CDC* pDC)
{
CSize rcResult = CSize(0,0);
if (m_pPicture != NULL)
{
long hmWidth;
long hmHeight;
m_pPicture->get_Width(&hmWidth);
m_pPicture->get_Height(&hmHeight); if (pDC==NULL)
{
CWindowDC dc(NULL);
dc.HIMETRICtoDP(&rcResult); // convert to pixels
}
else
{
rcResult.cx = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
rcResult.cy = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
}
} return rcResult;
}HBITMAP CPicture::GetHBmp()
{
return hBB;
}void CPicture::DeleteHBmp()
{
DeleteObject(hBB);
hBB = NULL;
}
http://www.codeproject.com/KB/graphics/pictureex.aspx
http://www.vckbase.com/vckbase/default.aspx