c++编写gif动画现实控件(二)

2012-11-13 13:24:09 · 作者: · 浏览: 839


    
    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;
   
    }
   
    }