DWORD WINAPI CGIFImage::DrawGIF(LPVOID l)
{
_sTHPar *par=(_sTHPar*)l;
int FrameCount=0;
long lPause=0;
HDC dc=::GetWindowDC(par->m_hWnd);
RECT rWin;
::GetClientRect(par->m_hWnd,&rWin);
RectF rF(rWin.left,rWin.top,rWin.right,rWin.bottom);
GUID Guid = FrameDimensionTime;
par->m_Img->SelectActiveFrame(&Guid,FrameCount);
Graphics gh(dc);
gh.DrawImage(par->m_Img,rF,0,0,par->m_Img->GetWidth(),par->m_Img->GetHeight(),UnitPixel);
DWORD dTick=GetTickCount();
lPause = ((long*)par->m_item->value)[FrameCount]*10;
while(1)
{
Sleep(1);
MSG msg;
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.message==WM_GIFSTOP)
{
::ReleaseDC(par->m_hWnd,dc);
delete par->m_Img;
delete[] par->m_item;
delete par;
return 0;
}
}
else
{
if(par->m_Count>1)
{
if(GetTickCount()-dTick>=lPause)
{
if ((FrameCount+1)==par->m_Count)
{
FrameCount=0;
par->m_Img->SelectActiveFrame(&Guid,0);
}
else
{
par->m_Img->SelectActiveFrame(&Guid,++FrameCount);
}
Graphics gh(dc);
gh.DrawImage(par->m_Img,rF,0,0,par->m_Img->GetWidth(),par->m_Img->GetHeight(),UnitPixel);
lPause = ((long*)par->m_item->value)[FrameCount]*10;
dTick=GetTickCount();
}
}
}
}
return 0;
}
void CGIFImage::Pause()
{
if(m_ThreadId)
{
typedef HANDLE (WINAPI *OPENTHREAD) (DWORD , BOOL , DWORD );
OPENTHREAD lpfnOpenThread = (OPENTHREAD)GetProcAddress(LoadLibrary(“kernel32.dll”),“OpenThread”);
HANDLE hThread = lpfnOpenThread(THREAD_ALL_ACCESS, FALSE, m_ThreadId);
SuspendThread(hThread);
m_state=0;
}
}
void CGIFImage::Resume()
{
if(m_ThreadId)
{
typedef HANDLE (WINAPI *OPENTHREAD) (DWORD , BOOL , DWORD );
OPENTHREAD lpfnOpenThread = (OPENTHREAD)GetProcAddress(LoadLibrary(“kernel32.dll”),“OpenThread”);
HANDLE hThread = lpfnOpenThread(THREAD_ALL_ACCESS, FALSE, m_ThreadId);
ResumeThread(hThread);
m_state=1;
}
}