Introduction
As passed , there is no convient enough way to play gif using functions provided by Microsoft Windows but you may need a reference of 3rd libs. Well now we have an alternative choice --- to use GDI+ .
Critical code

Code
//Here We load a gif image file
void CGIFControl::Load(LPCTSTR sFileName)
{
m_pImage = new Image(sFileName);
//First of all we should get the number of frame dimensions
//Images considered by GDI+ as:
//frames[animation_frame_index][how_many_animation];
UINT count = m_pImage->GetFrameDimensionsCount();
//Now we should get the identifiers for the frame dimensions
m_pDimensionIDs =new GUID[count];
m_pImage->GetFrameDimensionsList(m_pDimensionIDs, count);
//For gif image , we only care about animation set#0
WCHAR strGuid[39];
StringFromGUID2(m_pDimensionIDs[0], strGuid, 39);
m_FrameCount = m_pImage->GetFrameCount(&m_pDimensionIDs[0]);
//PropertyTagFrameDelay is a pre-defined identifier to present frame-delays by GDI+
UINT TotalBuffer = m_pImage->GetPropertyItemSize(PropertyTagFrameDelay);
m_pItem = (PropertyItem*)malloc(TotalBuffer);
m_pImage->GetPropertyItem(PropertyTagFrameDelay,TotalBuffer,m_pItem);
}
//To start play
void CGIFControl::Play()
{
//Set Current Frame at #0
m_iCurrentFrame = 0;
GUID Guid = FrameDimensionTime;
m_pImage->SelectActiveFrame(&Guid,m_iCurrentFrame);
//Use Timer
//NOTE HERE: frame-delay values should be multiply by 10
SetTimer(1,((UINT*)m_pItem[0].value)[m_iCurrentFrame] * 10,NULL);
//Move to the next frame
++ m_iCurrentFrame;
Invalidate(FALSE);
}
//Using timer
void CGIFControl::OnTimer(UINT_PTR nIDEvent)
{
//Because there will be a new delay value
KillTimer(nIDEvent);
//Change Active frame
GUID Guid = FrameDimensionTime;
m_pImage->SelectActiveFrame(&Guid,m_iCurrentFrame);
//New timer
SetTimer(1,((UINT*)m_pItem[0].value)[m_iCurrentFrame] * 10,NULL);
//Again move to the next
m_iCurrentFrame = (++ m_iCurrentFrame) % m_FrameCount;
Invalidate(FALSE);
}
//Finally simply draw
g.DrawImage(m_pImage,rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height());
//Will present the current frame
That's all the core.
Using the code
Simple usage:

Code
LinaBot::CommonCtrl::CGIFControl* pCtrl = new LinaBot::CommonCtrl::CGIFControl;
pCtrl->Create(rcCreate,TopWindow,c.wData.nID);
pCtrl->Load(GetSkinFileName(c.wData.BackGround));
pCtrl->SetURL(c.wData.sURL);
pCtrl->Play();