从DLL中获取GIF资源返回的Bit地图(GIF图片)只能显示第一帧
从DLL中获取GIF资源返回的Bitmap(GIF图片)只能显示第一帧
Bitmap * CResourceLoad::ResourcelLoad_GIF(UINT nID)
{
CheckThreadException(nID);
CResourceHandle cHandle(m_hDllLoad);
Bitmap * pBitmap = NULL;
HRSRC hResource = ::FindResource(m_hDllLoad, MAKEINTRESOURCE(nID), _T("vvv")); // type
if (!hResource)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.2 FindResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
DWORD imageSize = ::SizeofResource(m_hDllLoad, hResource);
if (!imageSize)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.3 SizeofResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
const void* pResourceData = ::LockResource(::LoadResource(m_hDllLoad, hResource));
if (!pResourceData)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.4 LockResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
void * hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (hBuffer)
{
void* pBuffer = ::GlobalLock(hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
{
pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (pBitmap)
{
if (pBitmap->GetLastStatus() != Gdiplus::Ok)
{
delete pBitmap;
pBitmap = NULL;
goto Exit;
}
}
}
::GlobalUnlock(hBuffer);
}
::GlobalFree(hBuffer);
hBuffer = NULL;
}
Exit:
return pBitmap;
}
DLL中获取GIF资源返回的Bitmap(GIF图片)只能显示第一帧(绘图代码如下:),请问上面这个代码处理正确吗?这个返回的Bitmap,调用pbitmap->GetFrameCount(pGuids); //获取GIF帧数有5帧,这个又是对的
GUID Guid = FrameDimensionTime; //定义一个GUID
DWORD i=graph.DrawImage(pbitmap, 0,0, pbitmap->GetWidth(), pbitmap->GetHeight());
pbitmap->SelectActiveFrame(&Guid, m_nIndex++); //设置下一帧
if(m_nIndex == 5) //判断当前帧是否为尾帧
m_nIndex = 0;
大侠赐教啊??
Bitmap * CResourceLoad::ResourcelLoad_GIF(UINT nID)
{
CheckThreadException(nID);
CResourceHandle cHandle(m_hDllLoad);
Bitmap * pBitmap = NULL;
HRSRC hResource = ::FindResource(m_hDllLoad, MAKEINTRESOURCE(nID), _T("vvv")); // type
if (!hResource)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.2 FindResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
DWORD imageSize = ::SizeofResource(m_hDllLoad, hResource);
if (!imageSize)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.3 SizeofResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
const void* pResourceData = ::LockResource(::LoadResource(m_hDllLoad, hResource));
if (!pResourceData)
{
CLIENT_ERROR("ResourceLoad_PNG_EX 2.4 LockResource ID = %d ,failed = %d",nID,GetLastError());
goto Exit;
}
void * hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (hBuffer)
{
void* pBuffer = ::GlobalLock(hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
{
pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (pBitmap)
{
if (pBitmap->GetLastStatus() != Gdiplus::Ok)
{
delete pBitmap;
pBitmap = NULL;
goto Exit;
}
}
}
::GlobalUnlock(hBuffer);
}
::GlobalFree(hBuffer);
hBuffer = NULL;
}
Exit:
return pBitmap;
}
DLL中获取GIF资源返回的Bitmap(GIF图片)只能显示第一帧(绘图代码如下:),请问上面这个代码处理正确吗?这个返回的Bitmap,调用pbitmap->GetFrameCount(pGuids); //获取GIF帧数有5帧,这个又是对的
GUID Guid = FrameDimensionTime; //定义一个GUID
DWORD i=graph.DrawImage(pbitmap, 0,0, pbitmap->GetWidth(), pbitmap->GetHeight());
pbitmap->SelectActiveFrame(&Guid, m_nIndex++); //设置下一帧
if(m_nIndex == 5) //判断当前帧是否为尾帧
m_nIndex = 0;
大侠赐教啊??
文章评论
相关解决方案