火急--GIF动画求助!!! (可在线等待)

jluhs 2003-08-21 09:16:13
我现在需要在应用程序中显示gif动画,但是这种显示是不能利用IPicture、Animate类或其他控件,该如何做为好啊?我的环境是C、C++(VC6.0),GIF动画的原理是什么啊?
恳请各位兄弟姐妹们鼎立相助,多谢!!
...全文
82 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
honglunxu 2003-08-22
  • 打赏
  • 举报
回复
mark
mfcstarter 2003-08-22
  • 打赏
  • 举报
回复
我有个CPictureEx类,可以播放gif文件,要的给我消息。
lonkil 2003-08-22
  • 打赏
  • 举报
回复
mark
以后用到了,再看!
  • 打赏
  • 举报
回复
// CBeexb_gifView message handlers
typedef struct gifImage{
WORD lWidth;
WORD lHeight;
WORD width;
WORD height;
struct flag{
BYTE d:3;
BYTE c:1;
BYTE b:3;
BYTE a:1;
}Flag;
}GifImage,*PGifImage;
#include <math.h>

static UINT GifThread(LPVOID gifDC)
{
CDC* pdc = (CDC*)gifDC;
HINSTANCE handle = ::AfxGetResourceHandle();
HRSRC hrsrc = ::FindResource(handle,MAKEINTRESOURCE(IDR_IMAGE2),"IMAGE");
DWORD word = ::SizeofResource(handle,hrsrc);
BYTE* lpBy = (BYTE*)LoadResource(handle,hrsrc);
BYTE* pByte[20];
DWORD nu[20];
int num = 0;
DWORD firstLocation = 0;
for(DWORD j=0;j<word;j++)
{
if(lpBy[j]==0x2c)
{
if(lpBy[j-1]==0x00)
{

if(num==0)
{
firstLocation = j;
}
PGifImage nowImage = (PGifImage)&lpBy[j+1];
if(nowImage->Flag.a==0)
{
DWORD number = 1+sizeof(GifImage);
while(lpBy[j+number]!=0)
{
number = number+(DWORD)lpBy[j+number]+1;
}
number++;
pByte[num] = new BYTE[number];
for(DWORD n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
else
{
int number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2,nowImage->Flag.d));
while(lpBy[j+number]!=0)
{
number = number+lpBy[j+number];
}
pByte[num] = new BYTE[number];
for(int n=0;n<number;n++)
{
*(BYTE*)(pByte[num]+n) = lpBy[j+n];
}
nu[num] = number;
j = j+number-1;
num++;
}
}
}
}
int i = 1;
while(i)
{
for(int m=0;m<num;m++)
{
CBrush brush(RGB(255,255,255));
pdc->FillRect(CRect(0,0,500,500),&brush);
DWORD DDD;
VirtualProtect(lpBy,word,PAGE_READWRITE,&DDD);
for(DWORD n=0;n<nu[m];n++)
{
lpBy[firstLocation+n] = *(BYTE*)(pByte[m]+n);
}
VirtualProtect(lpBy,word,DDD,NULL);



CMemFile file(lpBy,word);
CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);
CArchiveStream arcstream(&ar);
CComQIPtr<IPicture> m_picture;
HRESULT hr = OleLoadPicture((LPSTREAM)&arcstream,0,false,IID_IPicture,(void**)&m_picture);
long a,b;
m_picture->get_Width(&a);
m_picture->get_Height(&b);
CSize sz(a,b);
pdc->HIMETRICtoDP(&sz);
CRect rect;
m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
Sleep(1000);
}
}
return 1;
}

void CBeexb_gifView::OnShowGif()
{
static BOOL bIsRunning = FALSE;
if(!bIsRunning)
{
CDC* pdc = GetDC();
m_gifDC = new CDC;
m_gifDC->Attach(pdc->GetSafeHdc());
AfxBeginThread(GifThread,(LPVOID)m_gifDC);
bIsRunning = TRUE;
}
}
sevenking 2003-08-22
  • 打赏
  • 举报
回复
好像只能象bab说的 那样做
fanzai 2003-08-21
  • 打赏
  • 举报
回复
gz
wangbab 2003-08-21
  • 打赏
  • 举报
回复
我以前用过,不过是个笨办法。用photoshop包gif的每桢画面截取下来,通过Timer循环播放这些画面。占用内存较多。
我也想知道能直接播放gif的简便方法。
canoe_eyes 2003-08-21
  • 打赏
  • 举报
回复
up
jluhs 2003-08-21
  • 打赏
  • 举报
回复
还有没有其他建议啊,各位?GIF动画各帧之间的间隔时间该如何读取啊?

16,465

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧