CDialog using animated control
Posted
by Ran Almog
on October 1st, 2002
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); }

Comments
There are no comments yet. Be the first to comment!