|
int bExit;<br/>//此线程函数用来显示gif动画<br/>DWORD WINAPI ThreadProc( LPVOID lpParam ) <br/>{<br/>bExit = 0;//信号量<br/>HWND hwnd = (HWND)lpParam;<br/>HDC hdc = GetDC(hwnd);<br/>Graphics gh(hdc); //hDC是外部传入的画图DC<br/>Image image(L"logo.gif");<br/>if (image.GetLastStatus() != Ok)<br/>return 1;<br/><br/>UINT count = 0;<br/>count = image.GetFrameDimensionsCount();<br/>GUID *pDimensionIDs=(GUID*)new GUID[count];<br/>image.GetFrameDimensionsList(pDimensionIDs, count);<br/>WCHAR strGuid[39];<br/>StringFromGUID2(pDimensionIDs[0], strGuid, 39);<br/>UINT frameCount=image.GetFrameCount(&pDimensionIDs[0]);<br/>delete []pDimensionIDs; <br/>pDimensionIDs = NULL;<br/><br/>UINT size = image.GetPropertyItemSize(PropertyTagFrameDelay);<br/>ropertyItem *pItem = (PropertyItem *)malloc(size);<br/>image.GetPropertyItem(PropertyTagFrameDelay,size,pItem);<br/>//这样就把所有和PropertyTagFrameDelay属性相关的数据取到了pItem中。然后通过pItem访问结构中的value。每两帧图像之间的间隔时间是不一定相同的,所以还需要得到当前正显示的帧图像的索引值。最后调用Image对象的DrawImage函数把每帧图像画出来。简单代码如下:<br/><br/>EncoderParameters encoderParameters;<br/>ULONG parameterValue;<br/>GUID dimension = FrameDimensionTime;<br/><br/>// An EncoderParameters object has an array of<br/>// EncoderParameter objects. In this case, there is only<br/>// one EncoderParameter object in the array.<br/>encoderParameters.Count = 1;<br/><br/>// Initialize the one EncoderParameter object.<br/>encoderParameters.Parameter[0].Guid = EncoderSaveFlag;<br/>encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;<br/>encoderParameters.Parameter[0].NumberOfValues = 1;<br/>encoderParameters.Parameter[0].Value = &parameterValue;<br/><br/>// Get the CLSID of the TIFF encoder.<br/>CLSID encoderClsid;<br/>GetEncoderClsid(L"image/gif", &encoderClsid);//函数GetEncoderClsid在MSDN上有源代码<br/><br/>parameterValue = EncoderValueFrameDimensionPage;<br/><br/>int fcount=0;//当前祯的序号<br/><br/>//Guid的值在显示GIF为FrameDimensionTime,显示TIF时为FrameDimensionPage<br/>GUID Guid = FrameDimensionTime;<br/>long lPause=30;<br/>UINT width = image.GetWidth();<br/>UINT height = image.GetHeight();<br/><br/>ImageAttributes ia;<br/>Color lowColor(0,255,255,255);//白色是透明色<br/>Color highColor(255,255,255,255);<br/>ia.SetColorKey(lowColor,highColor);<br/><br/>IStream* pStream = NULL;<br/>if (::CreateStreamOnHGlobal(NULL, FALSE, &pStream) != S_OK)//用一个IStream对象缓存每一祯的数据<br/>{<br/>return 1;<br/>}<br/><br/>RectF rect(0,20.0,width,height);<br/>LARGE_INTEGER li;<br/>li.QuadPart = 0;<br/><br/>image.SelectActiveFrame(&Guid,0);<br/>image.Save(pStream, &encoderClsid, &encoderParameters);<br/><br/>while(1)<br/>{<br/>Image image1(pStream);<br/>gh.DrawImage(&image1,rect,0,0,width,height,UnitPixel,&ia);<br/><br/>//重新设置当前的活动数据帧<br/>image.SelectActiveFrame(&Guid,fcount++);<br/>if(fcount == frameCount) //frameCount是上面GetFrameCount返回值<br/>fcount= 0; //如果到了最后一帧数据又重新开始<br/>pStream->Seek(li,STREAM_SEEK_SET,NULL);<br/>image.Save(pStream, &encoderClsid, &encoderParameters);<br/>//计算此帧要延迟的时间<br/>lPause = ((long*)pItem->value)[fcount]*10;<br/>Sleep(lPause); //这里简单使用了sleep<br/>//::InvalidateRect(hwnd,&rect1,1);<br/>if(bExit)<br/>{<br/>ReleaseDC(hwnd,hdc);<br/>free(pItem);<br/>pStream->Release();<br/>return 0; <br/>}<br/>}<br/>return 0;<br/>}<br/><script language="javascript" src="/js/googlehead.js"></script><script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> |
|