作者:太阳下的泪
转自:http://blog.sina.com.cn/s/blog_5be1061c0100bhx7.html
SINA的BLOG字数限制太小了吧,,我只好分两部份发了.转别人的,在VS2005上编译改了点地方,可能使用.
此功能在我这个项目中,主要是显示让用户等待的提示。如开机过程、待机界面调用一个系统应用的过程、还有就是操作大尺寸图片的过程。
刚开始是用自定义的一个窗体来提示用户的,功能也可以实现,但美观度不够。所以才花了一定时间,对网上这个类进行研究。最终成功应用于项目中。
这个类的实现,主要是参考网上一个名为CGif89a类的实现。
此类在EVC4工程中可以正常使用。
索引:
1) GIF显示类头文件
2) GIF显示类的实现
3) 调用CGIFShow类示例
(1)定义全局变量
(2)在窗体的WM_CREATE消息处理中初始化CGIFShow类的实例
(3)GIF动画显示
(4)最后记得清理内存
=======================================
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
{
BYTEbit;
WORDpreviouscode;
WORDnextcode;
}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;
COLORREFm_TransparentColor;
HDC m_hDC;
BYTE* m_pcGlobalColorTable;
BYTE* m_pcBitmap;
BYTE* m_pcGif;
BYTE* m_pcGifTrack;
BOOL m_bGlass;
volatile intm_EndRun;
HBITMAPm_hRedrawBitmap;
int m_iGifWidth,m_iGifHeight;
volatileBOOL m_bLockBitmap;
TCHAR filename[_MAX_PATH];
int flag;
BOOL m_bRunMode;
BOOL m_bAutoSize1;
int m_nPosX;
int m_nPosY;
public:
CGIFShow(HDCpWnd);
~CGIFShow();
voidPlay();
voidPause(bool status);///暂停运行
voidStop();
voidSetPosition(int x,int y);
BOOLPlay1(void);
BOOLLoad(LPCTSTR filename);
HBITMAPFirstImage(void);
HBITMAPNextImage(void);
HBITMAPTakeIt(void);
HBITMAPDIBTohBitmap(HDC hDC,LPSTR lpSrcDIB);
voidOutput(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++;
}