CDialog using animated control | CodeGuru

CDialog using animated control

CAnimateDlg (located in AnimateDlg.h/cpp) is a simple class derived from CDialog in order to implement user designed animated control. The user of the class has to call SetAnimationProperties() method and to pass to it the ID of the static control that will use as an animation control, number of frames in the “movie”, array of […]

Written By
CodeGuru Staff
CodeGuru Staff
Oct 1, 2002
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

CAnimateDlg (located in AnimateDlg.h/cpp) is a simple class derived from
CDialog in order to implement user designed animated control. The user of
the class has to call SetAnimationProperties() method and to pass to it the
ID of the static control that will use as an animation control, number of
frames in the “movie”, array of bitmap IDs in the application resource and
the time-slice between frame (to set the animation speed).

Header File

#if !defined(AFX_ANIMATEDLG_H__64C0DD41_7BA0_11D1_8DC6_0000E8125FE5__INCLUDED_)
#define AFX_ANIMATEDLG_H__64C0DD41_7BA0_11D1_8DC6_0000E8125FE5__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// AnimateDlg.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CAnimateDlg dialog

class CAnimateDlg : public CDialog
{
// Construction
public:
	void StopAnimation();
	void StartAnimation();
	void SetAnimationProperties(UINT controlID,  BYTE nFrames, UINT *pImagesArray, UINT timeSliceBetweenFrames);
	CAnimateDlg();   // standard constructor
	~CAnimateDlg();

// Dialog Data
	//{{AFX_DATA(CAnimateDlg)
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAnimateDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(CAnimateDlg)
	afx_msg void OnTimer(UINT nIDEvent);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	CBitmap m_CurrentBmp;
	BYTE m_CurrentFrame;
	UINT m_TimeInterval;
	UINT* m_pFramesArray;
	BYTE m_nFrames;
	UINT m_TargetCtrl;
	BOOL m_bPlayingNow;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ANIMATEDLG_H__64C0DD41_7BA0_11D1_8DC6_0000E8125FE5__INCLUDED_)

CPP File

// AnimateDlg.cpp : implementation file
//

#include 
#include "AnimateDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAnimateDlg dialog


CAnimateDlg::CAnimateDlg()
{
	//{{AFX_DATA_INIT(CAnimateDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_TimeInterval = 0;
	m_pFramesArray = NULL;
	m_nFrames = 0;
	m_TargetCtrl = 0;
	m_CurrentFrame = 1;
}

CAnimateDlg::~CAnimateDlg()
{
	if (m_bPlayingNow)
		StopAnimation();
}


void CAnimateDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAnimateDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAnimateDlg, CDialog)
	//{{AFX_MSG_MAP(CAnimateDlg)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAnimateDlg message handlers

void CAnimateDlg::SetAnimationProperties(UINT controlID, BYTE nFrames, UINT * pImagesArray, UINT timeSliceBetweenFrames)
{
	m_TimeInterval = timeSliceBetweenFrames;
	m_pFramesArray = pImagesArray;
	m_nFrames = nFrames;
	m_TargetCtrl = controlID;
	m_bPlayingNow = FALSE;
}

void CAnimateDlg::StartAnimation()
{
	if (!m_bPlayingNow)
		SetTimer(0, m_TimeInterval, NULL);
}

void CAnimateDlg::StopAnimation()
{
	if (m_bPlayingNow)
		KillTimer(0);
}

void CAnimateDlg::OnTimer(UINT nIDEvent)
{
	if (m_CurrentFrame > m_nFrames)
		m_CurrentFrame = 1;

	CStatic *pTargetCtrl = (CStatic *) GetDlgItem(m_TargetCtrl);
	ASSERT(pTargetCtrl != NULL);
	m_CurrentBmp.Detach();
	m_CurrentBmp.LoadBitmap(m_pFramesArray[m_CurrentFrame - 1]);
	pTargetCtrl->SetBitmap(m_CurrentBmp);
	m_CurrentFrame++;

	CDialog::OnTimer(nIDEvent);
}
CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.