• EVC编程点滴-GIF动画显示类


    此功能在我这个项目中,主要是显示让用户等待的提示。如开机过程、待机界面调用一个系统应用的过程、还有就是操作大尺寸图片的过程。
    刚开始是用自定义的一个窗体来提示用户的,功能也可以实现,但美观度不够。所以才花了一定时间,对网上这个类进行研究。最终成功应用于项目中。
    这个类的实现,主要是参考网上一个名为CGif89a类的实现。
    此类在EVC4工程中可以正常使用。
    索引:
    1) GIF显示类头文件
    2) GIF显示类的实现
    3) 调用CGIFShow类示例
        (1) 定义全局变量
        (2) 在窗体的WM_CREATE消息处理中初始化CGIFShow类的实例
        (3) GIF动画显示
        (4) 最后记得清理内存
    =======================================
      1 1) GIF显示类头文件
      2 //////GIFShow.h////////
      3 #ifndef GIFSHOW_H
      4 #define GIFSHOW_H
      5 #define DISPOSAL_NO 0
      6 #define DISPOSAL_NOT 4
      7 #define DISPOSAL_RESTBACK 8
      8 #define DISPOSAL_RESTORE 12
      9 typedef struct
     10 {
     11     BYTE bit;
     12     WORD previouscode;
     13     WORD nextcode;
     14 }GIFTABLE;
     15 
     16 class CGIFShow
     17 {
     18 private:
     19     HDC     m_hWndHDC;
     20     bool    m_bPause;
     21     BOOL    m_bAutoStart;
     22     BOOL    m_bEmbed;
     23     BYTE    m_cCurentByte,m_cPackedField;
     24     UINT    m_uBitSize,m_uPrimaryBitSize;
     25     UINT    m_uRemain,m_uReadByte,m_uBlockSize;
     26     int     m_iWidth,m_iHeight;
     27     int     m_iTop,m_iLeft;
     28     int     m_iFinishCode,m_iResetCode;
     29     int     m_iPass,m_iRow;
     30     int     m_iWidth1;
     31     int     m_iBackgroundColor;
     32     int     m_iGifSize;
     33     int     m_x,m_y;
     34     int     m_iGlobalColorSize;
     35     int     m_iDisposalMethod;
     36     BOOL    m_bTransparentIndex;
     37     int     m_iTransparentIndex;
     38     int     m_iDelayTime;
     39     int     m_iTotalReadByte;
     40     int     m_iMaxByte;
     41     DWORD   m_dwSpeed;
     42     COLORREF m_TransparentColor;
     43     HDC     m_hDC;
     44     BYTE*   m_pcGlobalColorTable;
     45     BYTE*   m_pcBitmap;
     46     BYTE*   m_pcGif;
     47     BYTE*   m_pcGifTrack;
     48     BOOL    m_bGlass;
     49     volatile int m_EndRun;
     50     HBITMAP m_hRedrawBitmap;
     51     int     m_iGifWidth,m_iGifHeight;
     52     volatile BOOL   m_bLockBitmap;
     53     TCHAR   filename[_MAX_PATH];
     54     int     flag;
     55     BOOL    m_bRunMode;
     56     BOOL    m_bAutoSize1;
     57     int     m_nPosX;
     58     int     m_nPosY;
     59 public:
     60     CGIFShow(HDC pWnd);
     61     ~CGIFShow();
     62     void Play();
     63     void Pause(bool status);///暂停运行
     64     void Stop();
     65     void SetPosition(int x,int y);
     66     BOOL Play1(void);
     67     BOOL Load(LPCTSTR filename);
     68     HBITMAP FirstImage(void);
     69     HBITMAP NextImage(void);
     70     HBITMAP TakeIt(void);
     71     HBITMAP DIBTohBitmap(HDC hDC,LPSTR   lpSrcDIB);
     72     void Output(BYTE bit)
     73     {
     74         int tmp;
     75         if(m_cPackedField&0x40)
     76         {
     77             if(m_x==m_iWidth)
     78             {
     79                 m_x=0;
     80                 if(m_iPass==1)m_iRow+=8;
     81                 if(m_iPass==2)m_iRow+=8;
     82                 if(m_iPass==3)m_iRow+=4;
     83                 if(m_iPass==4)m_iRow+=2;
     84                 if(m_iRow>=m_iHeight){m_iPass+=1;m_iRow=16>>m_iPass;}
     85             }
     86             tmp=m_iRow*m_iWidth1+m_x;
     87             m_pcBitmap[tmp]=bit;
     88             m_x++;
     89         }
     90         else
     91         {
     92             if(m_x==m_iWidth){m_x=0;m_y++;}
     93             tmp=m_y*m_iWidth1+m_x;
     94             m_x++;
     95         }
     96         if(tmp>m_iMaxByte)return;
     97         m_pcBitmap[tmp]=bit;
     98     }
     99     BYTE GetByte(void)
    100     {
    101         if(m_uReadByte>=m_uBlockSize)
    102         {
    103             m_uBlockSize=*m_pcGifTrack++;
    104             m_uReadByte=0;
    105             m_iTotalReadByte+=m_uBlockSize+1;
    106             if(m_iTotalReadByte>m_iGifSize){m_iTotalReadByte-=m_uBlockSize+1;return 0xFF;}
    107             if(m_uBlockSize==0){m_pcGifTrack--;m_iTotalReadByte--;return 0xFF;}
    108         }
    109         m_uReadByte++;
    110         return *m_pcGifTrack++;
    111     }
    112     WORD GetCode(void)
    113     {
    114         UINT tmp1;
    115         BYTE tmp;
    116         tmp=1;
    117         if(m_uRemain>=m_uBitSize)
    118         {
    119             tmp<<=m_uBitSize;
    120             tmp--;
    121             tmp1=m_cCurentByte&tmp;
    122             m_cCurentByte>>=m_uBitSize;
    123             m_uRemain-=m_uBitSize;
    124         }
    125         else
    126         {
    127             tmp<<=m_uRemain;
    128             tmp--;
    129             tmp1=m_cCurentByte;
    130             m_cCurentByte=GetByte();
    131             tmp=1;
    132             if(8>=(m_uBitSize-m_uRemain))
    133             {
    134                 tmp<<=(m_uBitSize-m_uRemain);
    135                 tmp--;
    136                 tmp1=(((UINT)(m_cCurentByte&tmp))<<m_uRemain)+tmp1;
    137                 m_cCurentByte>>=(m_uBitSize-m_uRemain);
    138                 m_uRemain=8-(m_uBitSize-m_uRemain);
    139             }
    140             else
    141             {
    142                 tmp1=(((UINT)(m_cCurentByte))<<m_uRemain)+tmp1;
    143                 m_cCurentByte=GetByte();
    144                 tmp<<=m_uBitSize-m_uRemain-8;
    145                 tmp--;
    146                 tmp1=(((UINT)(m_cCurentByte&tmp))<<(m_uRemain+8))+tmp1;
    147                 m_cCurentByte>>=m_uBitSize-m_uRemain-8;
    148                 m_uRemain=8-(m_uBitSize-m_uRemain-8);
    149             }
    150         }
    151         return tmp1;
    152     }
    153 };
    154 #endif
    155 =======================================
    156 
    157 #include "stdafx.h"
    158 #include "GifShow.h"
    159 DWORD WINAPI ThreadFunc(CGIFShow* ptr)
    160 {
    161     ptr->Play1();
    162     return 0;
    163 }
    164 void CGIFShow::Play()
    165 {
    166     HANDLE hThread;
    167     DWORD ThreadId;
    168     if(m_hWndHDC==0)return ;
    169     if(m_pcGif==0)return;
    170     if(m_EndRun==5)return;
    171     m_pcGifTrack=m_pcGif;
    172     m_iTotalReadByte=0;
    173     m_EndRun=5;
    174     hThread=CreateThread(NULL,0,(unsigned long(_stdcall*)(void*))ThreadFunc,this,0,&ThreadId);
    175     CloseHandle(hThread);
    176     return;
    177 }
    178 BOOL CGIFShow::Play1(void)
    179 {
    180     HDC hDC,hMemDC,hMemDC1,hPauseMemDC;
    181     HBITMAP hOldBitmap,hOldBitmap1,hBitmap,hPreviousBitmap,hPauseBitmap;
    182     DWORD systimer1,systimer2,speed;
    183     BOOL PauseShow = FALSE;
    184     hDC = m_hWndHDC;
    185     hMemDC = ::CreateCompatibleDC(hDC);
    186     hMemDC1 = ::CreateCompatibleDC(hDC);
    187     hPauseMemDC = ::CreateCompatibleDC(hDC);
    188     m_hDC = hDC;
    189     hPreviousBitmap = 0;
    190     while(m_bLockBitmap)
    191     {
    192     }
    193     m_bLockBitmap = TRUE;
    194     if(m_hRedrawBitmap != 0)
    195     {
    196         DeleteObject(m_hRedrawBitmap);
    197     }
    198     m_hRedrawBitmap = ::CreateCompatibleBitmap(hDC,m_iGifWidth,m_iGifHeight);
    199     hOldBitmap1 = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);
    200     hPauseBitmap = ::CreateCompatibleBitmap(hDC,m_iGifWidth,m_iGifHeight);
    201     SelectObject(hPauseMemDC,hPauseBitmap);
    202     
    203     ::BitBlt(hMemDC1,0,0,m_iGifWidth,m_iGifHeight,hDC,m_nPosX,m_nPosY,SRCCOPY);
    204     SelectObject(hMemDC1,hOldBitmap1);
    205     m_bLockBitmap = FALSE;
    206     m_iDisposalMethod = DISPOSAL_NOT;
    207     while(1 != m_EndRun)
    208     {
    209         systimer2=systimer1 = GetTickCount();
    210         while(m_bLockBitmap)
    211         {
    212         }
    213         m_bLockBitmap = TRUE;
    214         hOldBitmap1 = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);
    215         
    216         switch(m_iDisposalMethod)
    217         {
    218         case DISPOSAL_NO:
    219             break;
    220         case DISPOSAL_NOT:
    221             break;
    222         case DISPOSAL_RESTBACK:
    223         case DISPOSAL_RESTORE:
    224             hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
    225             ::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
    226             SelectObject(hMemDC,hOldBitmap);
    227             DeleteObject(hPreviousBitmap);
    228             hPreviousBitmap = 0;
    229             break;
    230         }
    231         m_iDisposalMethod = DISPOSAL_NO;
    232         
    233         if(!PauseShow)
    234         {
    235             hBitmap=NextImage();
    236             switch(m_iDisposalMethod)
    237             {
    238             case DISPOSAL_NO:
    239                 break;
    240             case DISPOSAL_NOT:
    241                 break;
    242             case DISPOSAL_RESTBACK:
    243             case DISPOSAL_RESTORE:
    244                 hPreviousBitmap = ::CreateCompatibleBitmap(hDC,m_iWidth,m_iHeight);
    245                 hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
    246                 ::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hMemDC1,m_iLeft,m_iTop,SRCCOPY);
    247                 SelectObject(hMemDC,hOldBitmap);
    248                 break;
    249             }
    250             hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
    251             if(m_bTransparentIndex)
    252             {
    253                 HBITMAP    bmAndBack, bmAndObject;
    254                 HBITMAP    bmBackOld, bmObjectOld;
    255                 HDC        hdcBack, hdcObject;
    256                 COLORREF cColor;
    257                 hdcBack = ::CreateCompatibleDC(hDC);
    258                 hdcObject = ::CreateCompatibleDC(hDC);
    259                 bmAndBack = CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
    260                 bmAndObject = CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
    261                 bmBackOld = (HBITMAP)SelectObject(hdcBack,bmAndBack);
    262                 bmObjectOld = (HBITMAP)SelectObject(hdcObject,bmAndObject);
    263                 cColor = SetBkColor(hMemDC,m_TransparentColor);
    264                 ::BitBlt(hdcObject,0,0,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
    265                 SetBkColor(hMemDC,cColor);
    266                 ::BitBlt(hdcBack,0,0,m_iWidth,m_iHeight,hdcObject,0,0,NOTSRCCOPY);
    267                 ::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hdcObject,0,0,SRCAND);
    268                 ::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hdcBack,0,0,SRCAND);
    269                 ::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCPAINT);
    270                 DeleteObject(SelectObject(hdcBack,bmBackOld));
    271                 DeleteObject(SelectObject(hdcObject,bmObjectOld));
    272                 DeleteDC(hdcBack);
    273                 DeleteDC(hdcObject);
    274             }
    275             else
    276             {
    277                 ::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
    278             }
    279             SelectObject(hMemDC,hOldBitmap);
    280             DeleteObject(hBitmap);
    281             ::BitBlt(hDC,m_nPosX,m_nPosY,m_iGifWidth,m_iGifHeight,hMemDC1,0,0,SRCCOPY);
    282             ::BitBlt(hPauseMemDC,0,0,m_iGifWidth,m_iGifHeight,hMemDC1,0,0,SRCCOPY);
    283         }
    284         else
    285         {
    286             ::BitBlt(hDC,m_nPosX,m_nPosY,m_iGifWidth,m_iGifHeight,hPauseMemDC,0,0,SRCCOPY);
    287         }
    288         SelectObject(hMemDC1,hOldBitmap1);
    289         m_bLockBitmap = FALSE;
    290         if(0 != m_iDelayTime)
    291             speed = m_iDelayTime * 10;
    292         else
    293             speed=m_dwSpeed;
    294         while((1 != m_EndRun)&&(speed > systimer2 - systimer1))
    295         {
    296             Sleep(10);
    297             systimer2 = GetTickCount();
    298         }
    299     PauseShow = m_bPause;
    300     }
    301     if(hPreviousBitmap != 0)
    302         DeleteObject(hPreviousBitmap);
    303     DeleteDC(hMemDC);
    304     DeleteDC(hMemDC1);
    305     //::ReleaseDC(hDC);
    306     m_EndRun = 2;
    307     return TRUE;
    308 }
    309 
    310 void CGIFShow::Stop()
    311 {
    312     if(m_EndRun != 5)
    313         return;
    314     m_EndRun = 1;
    315     while(m_EndRun != 2)
    316     {
    317     }
    318     return;
    319 }
    320 CGIFShow::CGIFShow(HDC pWnd)
    321 {
    322     m_hWndHDC=pWnd;
    323     m_bPause=FALSE;
    324     m_bAutoStart=TRUE;
    325     m_bAutoSize1=TRUE;
    326     m_bEmbed=FALSE;
    327     m_pcGlobalColorTable=0;
    328     m_pcGif=0;
    329     m_iGifSize=0;
    330     m_iGlobalColorSize=0;
    331     m_bTransparentIndex=FALSE;
    332     m_iDelayTime=0;
    333     m_EndRun=0;
    334     m_dwSpeed=50;
    335     m_hRedrawBitmap=0;
    336     m_bLockBitmap=FALSE;
    337     flag=0;
    338     m_nPosX=0;
    339     m_nPosY=0;
    340     wcscpy(filename,_T(""));
    341     m_bRunMode=1;
    342     m_bGlass=FALSE;
    343 }
    344 CGIFShow::~CGIFShow(void)
    345 {
    346     Stop();
    347     if(m_hRedrawBitmap!=0)
    348         DeleteObject(m_hRedrawBitmap);
    349     if(m_pcGlobalColorTable!=NULL)
    350         delete[] m_pcGlobalColorTable;
    351     if(m_pcGif!=NULL)
    352         delete[] m_pcGif;
    353 }
    354 BOOL CGIFShow::Load(LPCTSTR filename)
    355 {
    356     HANDLE hFile;
    357     DWORD size,size1,readbyte;
    358     BYTE temp[13];
    359     if(m_bEmbed)
    360         return FALSE;
    361     
    362     Stop();
    363     if(m_pcGlobalColorTable!=NULL)
    364         delete[] m_pcGlobalColorTable;
    365     if(m_pcGif!=NULL)
    366         delete[] m_pcGif;
    367     if(m_hRedrawBitmap!=0)
    368     {
    369         DeleteObject(m_hRedrawBitmap);
    370         m_hRedrawBitmap=0;
    371     }
    372     m_pcGlobalColorTable=m_pcGif=0;
    373     m_iTotalReadByte=0;
    374     m_iGifSize=m_iGlobalColorSize=0;
    375     
    376     hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    377     if(INVALID_HANDLE_VALUE==hFile)
    378         return FALSE;
    379     size=GetFileSize(hFile,&size1);
    380     if(size==0xFFFFFFFF)
    381     {
    382         CloseHandle(hFile);
    383         return FALSE;
    384     }
    385     ReadFile(hFile,temp,13,&readbyte,NULL);
    386     if((readbyte!=13)||((temp[0]!='G')||(temp[1]!='I')||
    387         (temp[2]!='F')||(temp[3]!='8')||((temp[4]!='7')&&
    388         (temp[4]!='9'))||(temp[5]!='a')))
    389     {
    390         CloseHandle(hFile);
    391         return FALSE;
    392     }
    393     
    394     m_iGifWidth=*(temp+6);
    395     m_iGifHeight=*(temp+8);
    396     m_iBackgroundColor=temp[11];
    397     if(temp[10]&0x80)
    398     {
    399         m_iGlobalColorSize=0x01<<((temp[10]&0x07)+1);
    400         m_pcGlobalColorTable=new BYTE[3*m_iGlobalColorSize];
    401         ReadFile(hFile,m_pcGlobalColorTable,3*m_iGlobalColorSize,&readbyte,NULL);
    402         if(readbyte!=(DWORD)3*m_iGlobalColorSize)
    403         {
    404             delete[] m_pcGlobalColorTable;
    405             m_pcGlobalColorTable=0;
    406             m_iGlobalColorSize=0;
    407             CloseHandle(hFile);
    408             return FALSE;
    409         }
    410     }
    411     m_iGifSize=size-3*m_iGlobalColorSize-12;
    412     m_pcGifTrack=m_pcGif=new BYTE[m_iGifSize];
    413     ReadFile(hFile,m_pcGif,m_iGifSize,&readbyte,NULL);
    414     CloseHandle(hFile);
    415     return TRUE;
    416 }
    417 HBITMAP CGIFShow::NextImage(void)
    418 {
    419     if(m_pcGif==NULL)return 0;
    420     
    421 label2: if(m_iTotalReadByte>m_iGifSize)
    422     {
    423         m_pcGifTrack=m_pcGif;
    424         m_iTotalReadByte=0;return 0;
    425     }
    426     m_iTotalReadByte++;
    427     switch(*m_pcGifTrack++)
    428     {
    429     case 0x2C:
    430         return TakeIt();
    431         break;
    432     case 0x21:
    433             BYTE cSize;
    434             m_iTotalReadByte++;
    435             switch(*m_pcGifTrack++)
    436             {
    437             case 0xF9:
    438                 m_pcGifTrack++;//block size
    439                 m_iDisposalMethod=(*m_pcGifTrack)&28;
    440                 m_bTransparentIndex=(*m_pcGifTrack++)&1;
    441                 m_iDelayTime=*m_pcGifTrack;
    442                 m_pcGifTrack+=2;
    443                 m_iTransparentIndex=*m_pcGifTrack++;
    444                 m_iTotalReadByte+=5;
    445                 break;
    446             case 0xFE:
    447                 while((cSize=*m_pcGifTrack)!=0)
    448                 {
    449                     m_pcGifTrack+=cSize+1;
    450                     m_iTotalReadByte+=cSize+1;
    451                     if(m_iTotalReadByte>m_iGifSize)
    452                         return 0;
    453                 }
    454                 break;
    455             case 0x01:
    456                 m_pcGifTrack+=13;
    457                 m_iTotalReadByte+=13;
    458                 while((cSize=*m_pcGifTrack)!=0)
    459                 {
    460                     m_pcGifTrack+=cSize+1;
    461                     m_iTotalReadByte+=cSize+1;
    462                     if(m_iTotalReadByte>m_iGifSize)
    463                         return 0;
    464                 }
    465                 break;
    466             case 0xFF:
    467                 m_pcGifTrack+=12;
    468                 m_iTotalReadByte+=12;
    469                 while((cSize=*m_pcGifTrack)!=0)
    470                 {
    471                     m_pcGifTrack+=cSize+1;
    472                     m_iTotalReadByte+=cSize+1;
    473                     if(m_iTotalReadByte>m_iGifSize)
    474                         return 0;
    475                 }
    476                 break;
    477             default:
    478                 return FALSE;
    479             }
    480             m_pcGifTrack++;
    481             m_iTotalReadByte++;
    482             if(m_iTotalReadByte>m_iGifSize)
    483                 return 0;
    484             goto label2;
    485             break;
    486     case 0x3B:
    487         m_pcGifTrack=m_pcGif;
    488         m_iTotalReadByte=0;
    489         goto label2;
    490     case 0:
    491         goto label2;
    492     default:
    493         return FALSE;
    494     }
    495 }
    496 HBITMAP CGIFShow::TakeIt(void)
    497 {
    498     UINT uLocalColorTableSize;
    499     WORD code,oldcode,code1;
    500     int iFinishCode,iResetCode;
    501     int iPrimaryTableSize,iTableSize;
    502     BITMAPINFOHEADER *bitmapheader;
    503     BYTE *pcColorTable;
    504     BYTE *pcInfo;
    505     GIFTABLE *pcGifTable;
    506     HBITMAP hBitmap;
    507     m_iLeft=*m_pcGifTrack;
    508     m_pcGifTrack+=2;
    509     m_iTop=*m_pcGifTrack;
    510     m_pcGifTrack+=2;
    511     m_iWidth=*m_pcGifTrack;
    512     m_pcGifTrack+=2;
    513     m_iWidth1=((m_iWidth-1)|0x3)+1;
    514     m_iHeight=*m_pcGifTrack;
    515     m_pcGifTrack+=2;
    516     m_cPackedField=*m_pcGifTrack++;
    517     m_iTotalReadByte+=9;
    518     m_iMaxByte=m_iWidth1*m_iHeight;
    519     pcInfo=new BYTE[256*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER)+m_iMaxByte+sizeof(GIFTABLE)*4096];
    520     
    521     bitmapheader=(BITMAPINFOHEADER*)pcInfo;
    522     pcColorTable=pcInfo+sizeof(BITMAPINFOHEADER);
    523     m_pcBitmap=pcColorTable+256*sizeof(RGBQUAD);
    524     pcGifTable=(GIFTABLE*)(m_pcBitmap+m_iMaxByte);
    525     for(int i=0;i<4096;i++)
    526         pcGifTable[i].previouscode=pcGifTable[i].nextcode=0;
    527     bitmapheader->biSize=sizeof(BITMAPINFOHEADER);
    528     bitmapheader->biWidth=m_iWidth;
    529     bitmapheader->biHeight=-m_iHeight;
    530     bitmapheader->biPlanes=1;
    531     bitmapheader->biBitCount=8;
    532     bitmapheader->biCompression=BI_RGB;
    533     bitmapheader->biSizeImage=0;
    534     bitmapheader->biXPelsPerMeter=0;
    535     bitmapheader->biYPelsPerMeter=0;
    536     bitmapheader->biClrUsed=256;
    537     bitmapheader->biClrImportant=256;
    538     if(m_cPackedField&0x80)
    539     {
    540         uLocalColorTableSize=1;
    541         uLocalColorTableSize<<=(m_cPackedField&7)+1;
    542         if(m_bTransparentIndex)
    543         {
    544             m_TransparentColor=RGB(m_pcGifTrack[m_iTransparentIndex*3],m_pcGifTrack[m_iTransparentIndex*3+1],m_pcGifTrack[m_iTransparentIndex*3+2]);
    545         }
    546         m_iTotalReadByte+=uLocalColorTableSize*3;
    547         for(UINT i=0;i<uLocalColorTableSize;i++)
    548         {
    549             pcColorTable[2]=*m_pcGifTrack++;
    550             pcColorTable[1]=*m_pcGifTrack++;
    551             pcColorTable[0]=*m_pcGifTrack++;
    552             pcColorTable[3]=0;
    553             pcColorTable+=4;
    554         }
    555     }
    556     else
    557     {
    558         BYTE *pcGlobalColor=m_pcGlobalColorTable;
    559         if(m_bTransparentIndex)
    560         {
    561             m_TransparentColor=RGB(pcGlobalColor[m_iTransparentIndex*3],pcGlobalColor[m_iTransparentIndex*3+1],pcGlobalColor[m_iTransparentIndex*3+2]);
    562         }
    563         for(int i=0;i<m_iGlobalColorSize;i++)
    564         {
    565             pcColorTable[2]=*pcGlobalColor++;
    566             pcColorTable[1]=*pcGlobalColor++;
    567             pcColorTable[0]=*pcGlobalColor++;
    568             pcColorTable[3]=0;
    569             pcColorTable+=4;
    570         }
    571     }
    572     m_uPrimaryBitSize=m_uBitSize=(*m_pcGifTrack++);
    573     m_iTotalReadByte++;
    574     iPrimaryTableSize=iTableSize=(1<<m_uBitSize)+2;
    575     iFinishCode=iTableSize-1;
    576     iResetCode=iFinishCode-1;
    577     m_uPrimaryBitSize++;
    578     m_uBitSize++;
    579     m_uRemain=0;
    580     m_cCurentByte=0;
    581     m_uBlockSize=0;
    582     m_uReadByte=1;
    583     m_x=m_y=0;
    584     m_iPass=1;
    585     m_iRow=0;
    586     while((code=GetCode())!=iFinishCode)
    587     {
    588         if(code==iResetCode)
    589         {
    590             m_uBitSize=m_uPrimaryBitSize;
    591             iTableSize=iPrimaryTableSize;
    592             oldcode=GetCode();
    593             if(oldcode>iTableSize)
    594             {
    595                 delete[] pcInfo;
    596                 return 0;
    597             }
    598             Output((BYTE)oldcode);
    599             continue;
    600         }
    601         if(code<iTableSize) //<code> exist in the string pcGifTable
    602         {
    603             code1=code;
    604             WORD code2=0;
    605             while(code1>=iPrimaryTableSize)
    606             {
    607                 pcGifTable[code1].nextcode=code2;
    608                 code2=code1;
    609                 code1=pcGifTable[code1].previouscode;
    610                 if(code1>=code2)
    611                 {
    612                     delete[] pcInfo;
    613                     return 0;
    614                 }
    615             }
    616             Output((BYTE)code1);
    617             while(code2!=0)
    618             {
    619                 Output(pcGifTable[code2].bit);
    620                 code2=pcGifTable[code2].nextcode;
    621             }
    622             pcGifTable[iTableSize].bit=(BYTE)code1;
    623             pcGifTable[iTableSize].previouscode=oldcode;
    624             iTableSize++;
    625             if(iTableSize==(0x0001<<m_uBitSize))
    626                 m_uBitSize++;
    627             if(m_uBitSize>12)
    628                 m_uBitSize=12;
    629             oldcode=code;
    630         }
    631         else
    632         {
    633             code1=oldcode;
    634             WORD code2=0;
    635             while(code1>=iPrimaryTableSize)
    636             {
    637                 pcGifTable[code1].nextcode=code2;
    638                 code2=code1;
    639                 code1=pcGifTable[code1].previouscode;
    640                 if(code1>=code2)
    641                 {
    642                     delete[] pcInfo;
    643                     return 0;
    644                 }
    645             }
    646             Output((BYTE)code1);
    647             while(code2!=0)
    648             {
    649                 Output(pcGifTable[code2].bit);
    650                 code2=pcGifTable[code2].nextcode;
    651             }
    652             Output((BYTE)code1);
    653             pcGifTable[iTableSize].bit=(BYTE)code1;
    654             pcGifTable[iTableSize].previouscode=oldcode;
    655             iTableSize++;
    656             if(iTableSize==(0x0001<<m_uBitSize))
    657                 m_uBitSize++;
    658             if(m_uBitSize>12)
    659                 m_uBitSize=12;
    660             oldcode=code;
    661         }
    662     }
    663     hBitmap = DIBTohBitmap(m_hDC,(LPSTR)pcInfo);
    664     m_pcGifTrack++;
    665     m_iTotalReadByte++;
    666     delete[] pcInfo;
    667     return hBitmap;
    668 }
    669 void CGIFShow::SetPosition(int x,int y)
    670 {
    671     m_nPosX=x;
    672     m_nPosY=y;
    673 }
    674 void CGIFShow::Pause(bool status)
    675 {
    676     m_bPause=status;
    677 }
    678 HBITMAP CGIFShow::DIBTohBitmap(HDC hDC,LPSTR   lpSrcDIB)
    679  {
    680       HBITMAP   hBitmap   =   NULL;
    681       HBITMAP   hOldBmp   =   NULL;
    682       HDC   hTmpDC   =   NULL;
    683       BITMAPINFOHEADER* bitmapheader = (BITMAPINFOHEADER*)lpSrcDIB;
    684       hBitmap = CreateCompatibleBitmap(hDC,bitmapheader->biWidth,
    685           -(bitmapheader->biHeight));
    686       hTmpDC=CreateCompatibleDC(hDC);
    687       hOldBmp=(HBITMAP)SelectObject(hTmpDC,hBitmap);
    688       StretchDIBits(hTmpDC,0,0,bitmapheader->biWidth,
    689           -bitmapheader->biHeight,0,0,bitmapheader->biWidth,
    690           -bitmapheader->biHeight,lpSrcDIB+40 + 256*sizeof(RGBQUAD),(BITMAPINFO*)lpSrcDIB,
    691           DIB_RGB_COLORS,SRCCOPY);
    692       SelectObject(hTmpDC,hOldBmp);
    693       DeleteDC(hTmpDC);
    694       return   hBitmap;
    695  }
    =======================================
    3) 调用CGIFShow类示例
        (1) 定义全局变量
        CGIFShow *pGIFInst;
        
        (2) 在窗体的WM_CREATE消息处理中初始化CGIFShow类的实例
        pGIFInst = new CGIFShow(GetDC(hWnd));
        注: CGIFShow 类需要显示在类似于窗体这样(应该说是具有画布属性)的句柄上。
            在第一次使用CGIFShow类时,我想显示在listview上,但是没有成功
        
        (3) GIF动画显示
        if(pGIFInst->Load(TEXT("waiting.gif")))
        {
            RECT rcClient;
            GetClientRect(hWnd, &rcClient);
           
            pGIFInst->SetPosition(96,130);
            pGIFInst->Play();
        }
        /*需要等待处理的调用代码*/
        pGIFInst->Stop();
        
        (4) 最后记得清理内存
        if(NULL != pGIFInst)
            delete pGIFInst;
  • 相关阅读:
    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
    利用scp传输文件小结
    SSH无密码登录配置小结
    vim 清空
    mysql root用户 远程登录其它机器,看不到数据库
    音视频编解码开发经验2
    nginx、php-fpm、mysql用户权限解析
    ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)
    音视频编解码开发经验1
    mysql LAST_INSERT_ID 使用与注意事项
  • 原文地址:https://www.cnblogs.com/91program/p/5255627.html
Copyright © 2020-2023  润新知