XTreme ToolkitPro实例之1--Animation(对话框载入图片的动画显示)
XTreme ToolkitPro实例之1--Animation(对话框载入图片的动画显示)
一 说明
Animation工程演示了加载图片的动画显示方式,包括Xtreme定义的6种方式和用户自定义的3种方式,可以作为程序启动的splash画面的加载。
实现Animation主要是设置3个变量(再以这3个变量为参数调用Animate函数),它们是:
m_nType: Animation的实现方式:由enum XTAnimationType定义,或自定义
m_nSteps: 图片显示的步骤数step
m_nDelay: 每一步之间的间隔时间,以毫秒计算。
示例程序下载:
二 编码
1 创建Xtreme的对话框程序,名为Animation
2 添加bitmap资源
ID为IDB_DISNEY
2 在对话框中放置Picture控件
Type属性为Bitmap
Image属性为IDB_DISNEY
3 按照图示添加控件(左边为Picture控件,并放置位图IDB_DISNEY)
4 拷贝并添加Xtreme示例(成功安装Toolkit Pro之后,在安装目录下会有大量的示例程序)中Animation项目的AnimateStatic.h和AnimateStatic.cpp到当前工程。实现Animation的关键就在AnimateStatic类中,它包装了XTreme中实现图片加载的功能。
注意:将AnimateStatic.cpp中PreSubclassWindow()函数的语句
m_bmpGear.LoadBitmap(IDB_CODEJOCKGEAR);
改为
m_bmpGear.LoadBitmap(IDB_DISNEY);
5 在对话框中中添加公共成员变量并限制m_nDelay的范围为[1, 1000];m_nSteps的范围为[1, 100]
CEdit m_EdtSteps;
CEdit m_EdtDelay;
CAnimateStatic m_staticDisney;
int m_nDelay;
int m_nType;
int m_nSteps;
6 在CAnimationDlg的构造函数中初始化变量
CAnimationDlg::CAnimationDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAnimationDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAnimationDlg)
m_nDelay = m_staticDisney.GetAnimationDelay();
m_nType = m_staticDisney.GetAnimationType();
m_nSteps = m_staticDisney.GetAnimationSteps();
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
7 添加Animate按钮响应函数
void CAnimationDlg::OnBnClickedBtnAnimate()
{
// TODO: Add your control notification handler code here
UpdateData();
// set animation properties
m_staticDisney.SetAnimationDelay(m_nDelay);
m_staticDisney.SetAnimationType(m_nType);
m_staticDisney.SetAnimationSteps(m_nSteps);
// draw animation
m_staticDisney.Animate();
}
8 添加Delay Edit(注意不是Static)控件的EN_CHANGE事件处理函数
void CAnimationDlg::OnEnChangeEdtDelay()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
if (m_nDelay < 1 || m_nDelay > 1000)
{
m_nDelay = m_staticDisney.GetAnimationDelay();
UpdateData(FALSE);
m_EdtDelay.SetSel(0,-1);
}
}
9 添加Steps Edit(注意不是Static)控件的EN_CHANGE事件处理函数
void CAnimationDlg::OnEnChangeEdtSteps()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
if (m_nAnimationSteps < 1 || m_nAnimationSteps > 100)
{
m_nAnimationSteps = m_staticGear.GetAnimationSteps();
UpdateData(FALSE);
m_editSteps.SetSel(0,-1);
}
}
10 注意对话框的DoDataExchange函数
void CAnimationDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAnimationDlg)
DDX_Control(pDX, IDC_EDIT_STEPS, m_editSteps);
DDX_Control(pDX, IDC_EDIT_DELAY, m_editDelay);
DDX_Control(pDX, IDC_BMP_GEAR, m_staticGear);
DDX_Text(pDX, IDC_EDIT_DELAY, m_nAnimationDelay);
DDV_MinMaxInt(pDX, m_nAnimationDelay, 1, 1000);
DDX_Radio(pDX, IDC_RADIO_ANIMATION, m_nAnimationType);
DDX_Text(pDX, IDC_EDIT_STEPS, m_nAnimationSteps);
DDV_MinMaxInt(pDX, m_nAnimationSteps, 1, 100);
DDX_Control(pDX, IDC_STATIC_DELAY, m_staticDelay);
DDX_Control(pDX, IDC_STATIC_STEPS, m_staticSteps);
//}}AFX_DATA_MAP
}
若发现缺少某些内容,则按照上面的代码补全。
11 添加OnBnClickedRadio()函数,处理所有的Radio控件
添加函数声明和定义,并添加消息映射表的相应内容
三 总结
Animation程序通过类CAnimateStatic实现图片的动画加载,该类继承自对话框中的图片控件(本质上就是CStatic控件),包装了XTreme的相关功能,主要函数如下:
1 参数读写函数
SetAnimationType(): 设置动画类型,由enum XTAnimationType或用户自定义(调用CustomAnimation实现用户自定义的动画显示方式,目前支持Noise、Stretch和Circles3种自定义显示方式。若要增加新的自定义显示方式则需改写CustomAnimation函数)。
GetAnimationType(): 获得当前动画类型设置。
SetAnimationSteps(): 设置动画显示的步骤数,使动画显示逐步显示。与间隔时间一起决定动画加载的速度。
GetAnimationSteps(): 获得动画显示的步骤数。
SetAnimationDelay(): 每一步之间的间隔时间,以毫秒计算。与步骤数一起决定动画加载的速度。
GetAnimationDelay(): 获得间隔时间。
2 动画实现函数
Animate(): 根据设置的值(动画类型、步骤数和间隔时间)调用XTreme的Animate()函数实现图片显示。
3 如何实现自定义方式的图片显示
首先重载类的PreSubclassWindow()做控件的自定义。在该函数中调用XTreme的SetCustomAnimation()设置自定义显示函数。
然后编写自定义显示函数实现自己的显示方式(这里实现了Noise、Stretch和Circles3中方式)。