Click here to Skip to main content
14,693,685 members
Articles » Multimedia » GDI+ » Applications
Posted 30 Jun 2008


56 bookmarked

Play GIF using GDI+

Rate me:
Please Sign up or sign in to vote.
3.47/5 (21 votes)
1 Sep 2011CPOL
A new choice for playing GIF using GDI+


In the past, there was no convenient 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 from using GDI+

Base of GDI+

First of all, you need to include GDI+ headers, link the libs and using the namespace. In my sample, I did it in stdafx.h.

//GDI+ references
#include<gdiplus.h />
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")

Before using GDI+ in your application, you should initialize the enviroment code below:

//Init GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Status state = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Correspondent to initialize, you should clean up the environment.


Critical 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:
	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);

//To start play
void CGIFControl::Play()
	//Set Current Frame at #0
	m_iCurrentFrame = 0;
	GUID Guid = FrameDimensionTime;

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

//Using timer
void CGIFControl::OnTimer(UINT_PTR nIDEvent)
	//Because there will be a new delay value

	//Change Active frame
	GUID Guid = FrameDimensionTime;

	//New timer
	SetTimer(1,((UINT*)m_pItem[0].value)[m_iCurrentFrame] * 10,NULL);

	//Again move to the next
	m_iCurrentFrame = (++ m_iCurrentFrame) % m_FrameCount;

//Present current frame
void CGIFControl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
	Graphics g(lpDrawItemStruct->hDC);


	CRect rcClient;



Using the Code

Step 1: Set control correspondence in DoDataExchange method of sample dialog:


Step 2: Load the gif image in OnInitDialog:


Finally, add start and finish code in button event handler:

void CGifControlSampleDlg::OnBnClickedBtnPlay()

void CGifControlSampleDlg::OnBnClickedBtnStop()

About the Source

Binary files in attachment archive are compiled by VS2005SP1, so you may need to install the suit vcredist package by yourself first.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Yi Li
China China
No Biography provided

Comments and Discussions

QuestionWindow flickers a lot Pin
apurv14626-May-15 2:14
Memberapurv14626-May-15 2:14 
QuestionGuard Page exception Pin
Member 105681415-Mar-14 1:13
MemberMember 105681415-Mar-14 1:13 
GeneralMy vote of 4 Pin
shetkarabhijeet23-Nov-12 7:56
Membershetkarabhijeet23-Nov-12 7:56 
QuestionAbout interval of timer Pin
georgezzt12-Apr-12 16:21
Membergeorgezzt12-Apr-12 16:21 
GeneralMy vote of 5 Pin
Abu Mami19-Feb-12 2:13
MemberAbu Mami19-Feb-12 2:13 
GeneralMy vote of 5 Pin
Tage Lejon6-Sep-11 6:27
MemberTage Lejon6-Sep-11 6:27 
GeneralRe: My vote of 5 Pin
Yi Li6-Sep-11 7:31
MemberYi Li6-Sep-11 7:31 
QuestionNo copy,thx! Pin
Aric Wang4-Sep-11 23:51
MemberAric Wang4-Sep-11 23:51 
AnswerRe: No copy,thx! Pin
Yi Li6-Sep-11 7:24
MemberYi Li6-Sep-11 7:24 
Questionsame code Pin
merano23-Aug-11 8:26
Membermerano23-Aug-11 8:26 
AnswerRe: same code Pin
Yi Li31-Aug-11 22:54
MemberYi Li31-Aug-11 22:54 
Questionvery bad doku Pin
merano23-Aug-11 7:50
Membermerano23-Aug-11 7:50 
AnswerRe: very bad doku Pin
Yi Li31-Aug-11 23:01
MemberYi Li31-Aug-11 23:01 
GeneralJust a suggestion Pin
sandeepkavade19-Nov-08 19:38
Membersandeepkavade19-Nov-08 19:38 
GeneralRe: Just a suggestion Pin
Yi Li6-Sep-11 7:33
MemberYi Li6-Sep-11 7:33 
GeneralWhich Library Pin
Dileep.M1-Jul-08 3:04
MemberDileep.M1-Jul-08 3:04 
GeneralRe: Which Library Pin
Yi Li1-Jul-08 18:14
MemberYi Li1-Jul-08 18:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.