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 }