WM下有没有什么好的显示动画GIF的类库?

gln 2009-11-18 10:59:44
如题,要C++的,谢谢
...全文
142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gln 2009-11-18
  • 打赏
  • 举报
回复
Gif89a是GIF的格式名吧
beautymind2008 2009-11-18
  • 打赏
  • 举报
回复
Gif89a
gln 2009-11-18
  • 打赏
  • 举报
回复
谢谢,我试试
pysjp 2009-11-18
  • 打赏
  • 举报
回复

BOOL CGIFShow::Load(LPCTSTR filename)
{
HANDLE hFile;
DWORD size,size1,readbyte;
BYTE temp[13];

if(m_bEmbed)
return FALSE;

Stop();
if(m_pcGlobalColorTable!=NULL)
delete[] m_pcGlobalColorTable;
if(m_pcGif!=NULL)
delete[] m_pcGif;
if(m_hRedrawBitmap!=0)
{
DeleteObject(m_hRedrawBitmap);
m_hRedrawBitmap=0;
}
m_pcGlobalColorTable=m_pcGif=0;
m_iTotalReadByte=0;
m_iGifSize=m_iGlobalColorSize=0;

hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hFile)
return FALSE;
size=GetFileSize(hFile,&size1);
if(size==0xFFFFFFFF)
{
CloseHandle(hFile);
return FALSE;
}
ReadFile(hFile,temp,13,&readbyte,NULL);
if((readbyte!=13)||((temp[0]!='G')||(temp[1]!='I')||
(temp[2]!='F')||(temp[3]!='8')||((temp[4]!='7')&&
(temp[4]!='9'))||(temp[5]!='a')))
{
CloseHandle(hFile);
return FALSE;
}

m_iGifWidth=*(temp+6);
m_iGifHeight=*(temp+8);
m_iBackgroundColor=temp[11];
if(temp[10]&0x80)
{
m_iGlobalColorSize=0x01<<((temp[10]&0x07)+1);
m_pcGlobalColorTable=new BYTE[3*m_iGlobalColorSize];
ReadFile(hFile,m_pcGlobalColorTable,3*m_iGlobalColorSize,&readbyte,NULL);
if(readbyte!=(DWORD)3*m_iGlobalColorSize)
{
delete[] m_pcGlobalColorTable;
m_pcGlobalColorTable=0;
m_iGlobalColorSize=0;
CloseHandle(hFile);
return FALSE;
}
}

m_iGifSize=size-3*m_iGlobalColorSize-12;
m_pcGifTrack=m_pcGif=new BYTE[m_iGifSize];
ReadFile(hFile,m_pcGif,m_iGifSize,&readbyte,NULL);
CloseHandle(hFile);
return TRUE;
}

HBITMAP CGIFShow::NextImage(void)
{
if(m_pcGif==NULL)return 0;

label2: if(m_iTotalReadByte>m_iGifSize)
{
m_pcGifTrack=m_pcGif;
m_iTotalReadByte=0;return 0;
}
m_iTotalReadByte++;
switch(*m_pcGifTrack++)
{
case 0x2C:
return TakeIt();
break;
case 0x21:
BYTE cSize;
m_iTotalReadByte++;
switch(*m_pcGifTrack++)
{
case 0xF9:
m_pcGifTrack++;//block size
m_iDisposalMethod=(*m_pcGifTrack)&28;
m_bTransparentIndex=(*m_pcGifTrack++)&1;

m_iDelayTime=*m_pcGifTrack;
m_pcGifTrack+=2;
m_iTransparentIndex=*m_pcGifTrack++;
m_iTotalReadByte+=5;
break;
case 0xFE:
while((cSize=*m_pcGifTrack)!=0)
{
m_pcGifTrack+=cSize+1;
m_iTotalReadByte+=cSize+1;
if(m_iTotalReadByte>m_iGifSize)
return 0;
}
break;
case 0x01:
m_pcGifTrack+=13;
m_iTotalReadByte+=13;
while((cSize=*m_pcGifTrack)!=0)
{
m_pcGifTrack+=cSize+1;
m_iTotalReadByte+=cSize+1;
if(m_iTotalReadByte>m_iGifSize)
return 0;
}
break;
case 0xFF:
m_pcGifTrack+=12;
m_iTotalReadByte+=12;
while((cSize=*m_pcGifTrack)!=0)
{
m_pcGifTrack+=cSize+1;
m_iTotalReadByte+=cSize+1;
if(m_iTotalReadByte>m_iGifSize)
return 0;
}
break;
default:
return FALSE;
}
m_pcGifTrack++;
m_iTotalReadByte++;
if(m_iTotalReadByte>m_iGifSize)
return 0;
goto label2;
break;
case 0x3B:
m_pcGifTrack=m_pcGif;
m_iTotalReadByte=0;
goto label2;
case 0:
goto label2;
default:
return FALSE;
}
}
pysjp 2009-11-18
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include "GifShow.h"

DWORD WINAPI ThreadFunc(CGIFShow* ptr)
{
ptr->Play1();
return 0;
}

void CGIFShow::Play()
{
HANDLE hThread;
DWORD ThreadId;
if(m_hWndHDC==0)return ;
if(m_pcGif==0)return;
if(m_EndRun==5)return;
m_pcGifTrack=m_pcGif;
m_iTotalReadByte=0;
m_EndRun=5;
hThread=CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))ThreadFunc,this,0,&ThreadId);
CloseHandle(hThread);
return;
}

BOOL CGIFShow::Play1(void)
{
HDC hDC,hMemDC,hMemDC1,hPauseMemDC;
HBITMAP hOldBitmap,hOldBitmap1,hBitmap,hPreviousBitmap,hPauseBitmap;
DWORD systimer1,systimer2,speed;
BOOL PauseShow = FALSE;

hDC = m_hWndHDC;
hMemDC = ::CreateCompatibleDC(hDC);
hMemDC1 = ::CreateCompatibleDC(hDC);
hPauseMemDC = ::CreateCompatibleDC(hDC);
m_hDC = hDC;
hPreviousBitmap = 0;
while(m_bLockBitmap)
{
}

m_bLockBitmap = TRUE;
if(m_hRedrawBitmap != 0)
{
DeleteObject(m_hRedrawBitmap);
}
m_hRedrawBitmap = ::CreateCompatibleBitmap(hDC,m_iGifWidth,m_iGifHeight);
hOldBitmap1 = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);
hPauseBitmap = ::CreateCompatibleBitmap(hDC,m_iGifWidth,m_iGifHeight);
SelectObject(hPauseMemDC,hPauseBitmap);

::BitBlt(hMemDC1,0,0,m_iGifWidth,m_iGifHeight,hDC,m_nPosX,m_nPosY,SRCCOPY);
SelectObject(hMemDC1,hOldBitmap1);
m_bLockBitmap = FALSE;
m_iDisposalMethod = DISPOSAL_NOT;
while(1 != m_EndRun)
{
systimer2=systimer1 = GetTickCount();
while(m_bLockBitmap)
{
}
m_bLockBitmap = TRUE;
hOldBitmap1 = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);

switch(m_iDisposalMethod)
{
case DISPOSAL_NO:
break;
case DISPOSAL_NOT:
break;
case DISPOSAL_RESTBACK:
case DISPOSAL_RESTORE:
hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC,hOldBitmap);
DeleteObject(hPreviousBitmap);
hPreviousBitmap = 0;
break;
}
m_iDisposalMethod = DISPOSAL_NO;

if(!PauseShow)
{
hBitmap=NextImage();

switch(m_iDisposalMethod)
{
case DISPOSAL_NO:
break;
case DISPOSAL_NOT:
break;
case DISPOSAL_RESTBACK:
case DISPOSAL_RESTORE:
hPreviousBitmap = ::CreateCompatibleBitmap(hDC,m_iWidth,m_iHeight);
hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hMemDC1,m_iLeft,m_iTop,SRCCOPY);
SelectObject(hMemDC,hOldBitmap);
break;
}
hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
if(m_bTransparentIndex)
{
HBITMAP bmAndBack, bmAndObject;
HBITMAP bmBackOld, bmObjectOld;
HDC hdcBack, hdcObject;
COLORREF cColor;

hdcBack = ::CreateCompatibleDC(hDC);
hdcObject = ::CreateCompatibleDC(hDC);
bmAndBack = CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
bmAndObject = CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
bmBackOld = (HBITMAP)SelectObject(hdcBack,bmAndBack);
bmObjectOld = (HBITMAP)SelectObject(hdcObject,bmAndObject);
cColor = SetBkColor(hMemDC,m_TransparentColor);
::BitBlt(hdcObject,0,0,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
SetBkColor(hMemDC,cColor);
::BitBlt(hdcBack,0,0,m_iWidth,m_iHeight,hdcObject,0,0,NOTSRCCOPY);
::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hdcObject,0,0,SRCAND);
::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hdcBack,0,0,SRCAND);
::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCPAINT);
DeleteObject(SelectObject(hdcBack,bmBackOld));
DeleteObject(SelectObject(hdcObject,bmObjectOld));
DeleteDC(hdcBack);
DeleteDC(hdcObject);
}
else
{
::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
}
SelectObject(hMemDC,hOldBitmap);
DeleteObject(hBitmap);
::BitBlt(hDC,m_nPosX,m_nPosY,m_iGifWidth,m_iGifHeight,hMemDC1,0,0,SRCCOPY);
::BitBlt(hPauseMemDC,0,0,m_iGifWidth,m_iGifHeight,hMemDC1,0,0,SRCCOPY);

}
else
{
::BitBlt(hDC,m_nPosX,m_nPosY,m_iGifWidth,m_iGifHeight,hPauseMemDC,0,0,SRCCOPY);
}

SelectObject(hMemDC1,hOldBitmap1);
m_bLockBitmap = FALSE;
if(0 != m_iDelayTime)
speed = m_iDelayTime * 10;
else
speed=m_dwSpeed;
while((1 != m_EndRun)&&(speed > systimer2 - systimer1))
{
Sleep(10);
systimer2 = GetTickCount();
}
PauseShow = m_bPause;
}
if(hPreviousBitmap != 0)
DeleteObject(hPreviousBitmap);
DeleteDC(hMemDC);
DeleteDC(hMemDC1);
//::ReleaseDC(hDC);
m_EndRun = 2;
return TRUE;
}


void CGIFShow::Stop()
{
if(m_EndRun != 5)
return;
m_EndRun = 1;
while(m_EndRun != 2)
{
}
return;
}

CGIFShow::CGIFShow(HDC pWnd)
{
m_hWndHDC=pWnd;
m_bPause=FALSE;
m_bAutoStart=TRUE;
m_bAutoSize1=TRUE;
m_bEmbed=FALSE;
m_pcGlobalColorTable=0;
m_pcGif=0;
m_iGifSize=0;
m_iGlobalColorSize=0;
m_bTransparentIndex=FALSE;
m_iDelayTime=0;
m_EndRun=0;
m_dwSpeed=50;
m_hRedrawBitmap=0;
m_bLockBitmap=FALSE;
flag=0;
m_nPosX=0;
m_nPosY=0;
wcscpy(filename,_T(""));
m_bRunMode=1;
m_bGlass=FALSE;
}

CGIFShow::~CGIFShow(void)
{
Stop();
if(m_hRedrawBitmap!=0)
DeleteObject(m_hRedrawBitmap);
if(m_pcGlobalColorTable!=NULL)
delete[] m_pcGlobalColorTable;
if(m_pcGif!=NULL)
delete[] m_pcGif;
}
pysjp 2009-11-18
  • 打赏
  • 举报
回复
下面是别人写的


1) GIF显示类头文件
//////GIFShow.h////////
#ifndef GIFSHOW_H
#define GIFSHOW_H

#define DISPOSAL_NO 0
#define DISPOSAL_NOT 4
#define DISPOSAL_RESTBACK 8
#define DISPOSAL_RESTORE 12

typedef struct
{
BYTE bit;
WORD previouscode;
WORD nextcode;
}GIFTABLE;


class CGIFShow
{
private:
HDC m_hWndHDC;
bool m_bPause;
BOOL m_bAutoStart;
BOOL m_bEmbed;
BYTE m_cCurentByte,m_cPackedField;
UINT m_uBitSize,m_uPrimaryBitSize;
UINT m_uRemain,m_uReadByte,m_uBlockSize;
int m_iWidth,m_iHeight;
int m_iTop,m_iLeft;
int m_iFinishCode,m_iResetCode;
int m_iPass,m_iRow;
int m_iWidth1;
int m_iBackgroundColor;
int m_iGifSize;
int m_x,m_y;
int m_iGlobalColorSize;
int m_iDisposalMethod;
BOOL m_bTransparentIndex;
int m_iTransparentIndex;
int m_iDelayTime;
int m_iTotalReadByte;
int m_iMaxByte;
DWORD m_dwSpeed;
COLORREF m_TransparentColor;
HDC m_hDC;
BYTE* m_pcGlobalColorTable;
BYTE* m_pcBitmap;
BYTE* m_pcGif;
BYTE* m_pcGifTrack;
BOOL m_bGlass;
volatile int m_EndRun;
HBITMAP m_hRedrawBitmap;
int m_iGifWidth,m_iGifHeight;
volatile BOOL m_bLockBitmap;
TCHAR filename[_MAX_PATH];
int flag;
BOOL m_bRunMode;
BOOL m_bAutoSize1;
int m_nPosX;
int m_nPosY;

public:
CGIFShow(HDC pWnd);
~CGIFShow();
void Play();
void Pause(bool status);///暂停运行
void Stop();
void SetPosition(int x,int y);
BOOL Play1(void);
BOOL Load(LPCTSTR filename);
HBITMAP FirstImage(void);
HBITMAP NextImage(void);
HBITMAP TakeIt(void);
HBITMAP DIBTohBitmap(HDC hDC,LPSTR lpSrcDIB);

void Output(BYTE bit)
{
int tmp;
if(m_cPackedField&0x40)
{
if(m_x==m_iWidth)
{
m_x=0;
if(m_iPass==1)m_iRow+=8;
if(m_iPass==2)m_iRow+=8;
if(m_iPass==3)m_iRow+=4;
if(m_iPass==4)m_iRow+=2;
if(m_iRow>=m_iHeight){m_iPass+=1;m_iRow=16>>m_iPass;}
}
tmp=m_iRow*m_iWidth1+m_x;
m_pcBitmap[tmp]=bit;
m_x++;
}
else
{
if(m_x==m_iWidth){m_x=0;m_y++;}
tmp=m_y*m_iWidth1+m_x;
m_x++;
}
if(tmp>m_iMaxByte)return;
m_pcBitmap[tmp]=bit;
}

BYTE GetByte(void)
{
if(m_uReadByte>=m_uBlockSize)
{
m_uBlockSize=*m_pcGifTrack++;
m_uReadByte=0;
m_iTotalReadByte+=m_uBlockSize+1;
if(m_iTotalReadByte>m_iGifSize){m_iTotalReadByte-=m_uBlockSize+1;return 0xFF;}
if(m_uBlockSize==0){m_pcGifTrack--;m_iTotalReadByte--;return 0xFF;}
}
m_uReadByte++;
return *m_pcGifTrack++;
}

WORD GetCode(void)
{
UINT tmp1;
BYTE tmp;
tmp=1;
if(m_uRemain>=m_uBitSize)
{
tmp<<=m_uBitSize;
tmp--;
tmp1=m_cCurentByte&tmp;
m_cCurentByte>>=m_uBitSize;
m_uRemain-=m_uBitSize;
}
else
{
tmp<<=m_uRemain;
tmp--;
tmp1=m_cCurentByte;
m_cCurentByte=GetByte();
tmp=1;
if(8>=(m_uBitSize-m_uRemain))
{
tmp<<=(m_uBitSize-m_uRemain);
tmp--;
tmp1=(((UINT)(m_cCurentByte&tmp))<<m_uRemain)+tmp1;
m_cCurentByte>>=(m_uBitSize-m_uRemain);
m_uRemain=8-(m_uBitSize-m_uRemain);
}
else
{
tmp1=(((UINT)(m_cCurentByte))<<m_uRemain)+tmp1;
m_cCurentByte=GetByte();
tmp<<=m_uBitSize-m_uRemain-8;
tmp--;
tmp1=(((UINT)(m_cCurentByte&tmp))<<(m_uRemain+8))+tmp1;
m_cCurentByte>>=m_uBitSize-m_uRemain-8;
m_uRemain=8-(m_uBitSize-m_uRemain-8);
}
}
return tmp1;
}

};
#endif

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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