最近在看GDIPLUS,看到了可以加载jpg,png,gif等格式的图片,顺手写了一个jpg,发现没问题,写了一个gif,发现只加载了gif的第一个帧,在codeproject+msdn上找到了一些资料:关于如何加载动态的gif图像。
首先写了一个加载GIF的函数如下:
void showimage(HDC hdc)
{
Image *image=new Image(L"123.gif");
UINT count=0;
count=image->GetFrameDimensionsCount();
GUID *pDimensionIDs=(GUID*)new GUID[count];
image->GetFrameDimensionsList(pDimensionIDs,count);
WCHAR strGuid[39];
StringFromGUID2(pDimensionIDs[0],strGuid,39);
UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);
delete []pDimensionIDs;
int size=image->GetPropertyItemSize(PropertyTagFrameDelay);
PropertyItem* pItem=NULL;
pItem=(PropertyItem*)malloc(size);
image->GetPropertyItem(PropertyTagFrameDelay,size,pItem);
UINT fcount=0;
GUID Guid=FrameDimensionTime;
while(true)
{
Graphics graphics(hdc);
graphics.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
image->SelectActiveFrame(&Guid,fcount++);
if(fcount==frameCount)
fcount=0;
long lPause=((long*)pItem->value)[fcount]*10;
Sleep(lPause);
}
}
我把放到了WM_PAINT消息中,但是运行发现动态gif确实显示出来了,但是当程序窗口失去焦点进而发生重绘的时候发现图片就不会动了,最小最大化也是如此。具体原因也不是十分清楚,可能跟里面的那个死循环有关吧。
过了一会,想到了多线程来取代上述方法,只需要在主线程的WM_PAIT中创建一个线程,其他的显示工作都交给该线程去实现,代码如下:
void __cdecl showimage(LPVOID)
{
HDC hdc=GetDC(g_hWnd);
Image *image=new Image(L"123.gif");
UINT count=0;
count=image->GetFrameDimensionsCount();
GUID *pDimensionIDs=(GUID*)new GUID[count];
image->GetFrameDimensionsList(pDimensionIDs,count);
WCHAR strGuid[39];
StringFromGUID2(pDimensionIDs[0],strGuid,39);
UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);
delete []pDimensionIDs;
int size=image->GetPropertyItemSize(PropertyTagFrameDelay);
PropertyItem* pItem=NULL;
pItem=(PropertyItem*)malloc(size);
image->GetPropertyItem(PropertyTagFrameDelay,size,pItem);
UINT fcount=0;
GUID Guid=FrameDimensionTime;
while(true)
{
Graphics graphics(hdc);
graphics.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
image->SelectActiveFrame(&Guid,fcount++);
if(fcount==frameCount)
fcount=0;
long lPause=((long*)pItem->value)[fcount]*10;
Sleep(lPause);
}
ReleaseDC(g_hWnd,hdc);
}
WM_PAINT消息:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
_beginthread(showimage,0,0);
//showimage(hdc);
EndPaint(hWnd, &ps);
break;
运行发现此时上述的那个重绘时遇到的图片假死已经不复存在了,这个时候表明看起来没什么问题了,但是仔细看发现gif图片交换的频率好像快了不少(跟原来的123.gif进行了肉眼对比),显的跟原版图片还是有点差距的,这里又是啥原因呢,是因为Sleep的不准确所导致的吗?那有什么办法来解决此问题吗?还请各位大侠发表一下自己的看法。三克油。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!