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: 每一步之间的间隔时间,以毫秒计算。

示例程序下载:

   示例程序(VC6)

    示例程序(VC2005)


二 编码

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中方式)。

posted @ 2012-08-07 13:33  杀 手  阅读(759)  评论(0编辑  收藏  举报