VC应用程序上引用动画的效果
来源:互联网 发布:js游戏引擎 编辑:程序博客网 时间:2024/05/15 23:43
1 动画实现原理
窗口标题栏上、工具条上、状态条上存在的都是一些较小的图像,我们可通过不同的相对连续的几幅静态画面按一定的时间间隔显示来实现动画的效果。在VC中有一个CImageList类(CImageList 类提供了Windows图像列表通用控件功能),可以以图像列表的方式管理图像,图像列表中的图像大小相同,索引以0为开始,每个图像都可以单独引用。接着,利用Draw函数在一定的时间间隔播放出来。Microsoft Win32 的API提供了一系列的函数,可以利用这些函数创建、销毁图像列表,可以显示图像、增加和删除图像,替代、合并和拖动图像。
2 主要函数介绍
(1)BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow )。
该函数用于创建一个图像列表。 cx,cy 每个图像的宽度和高度;nFlags图像列表的类型,其值仅可包含一个ILC_COLOR值。nInitial 图像列表最初含有的图像数目;nGrow 当图像数量需要改变时,每次动态增长的图像数。
(2)BOOL Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle )。
该函数用于显示一个图像。pdc 目标设备上下文的指针;nImage 要显示的图像索引;pt 图像显示的位置;nStyle图像显示风格。
(3)HICON ExtractIcon( int nImage )。
利用该函数可以得到一函数的句柄。
(4)int Add( HICON hIcon )。
该函数把一个图像加入图像列表。
在程序中声明一个CImageList类,调用Create函数创建该类,然后以一定的时间用Draw函数循环显示图像,就可以形成动画效果。Create类有几个重载函数,可以根据不同的资源调用不同的函数,为了简便其间,本文只采用图标资源。
3 具体实现
首先,建立图表资源。在VC++6.0中利用资源编辑器,建立几幅图表,IDI_ICON1、IDI_ICON2、IDI_ICON3....,在编辑图标时选者Custom,将图标设置成大小为64X32。由于Windows的各个部件不完全相同,其实现方法也不完全相同,下面对在窗口不同位置显示动画的方法分别介绍。
3.1 状态条上显示动画状态条也是窗口,所以也可以在其上显示动画。状态条时主窗口的子窗口,在CMainFrame类中可以看到下列代码:
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
所以为了在状态条上显示动画,其编程代码应在CMainFrame类中加入。首先创建资源文件和图像列表类。
在类的定义文件中加入下列变量:
POINT pt1;//图像显示的位置
int m_Play; //将要显示图像的索引
void CreateImageList();//创建图像列表的函数
CImageList m_ImageList1;//图像列表对象
int m_ImageNumber; //图像列表中图像的总数目
首先在创建函数时初始化pt1,m_Play,m_ImageNumber:
CImageView::CImageView(){// TODO: add construction code herept1.x =1;pt1.y =1;m_Play=0;m_ImageNumber=0;}CreateImageList()的实现如下:
void CImageView::CreateImageList(){m_ImageList1.Create (64,32,ILC_COLOR,5,2);HICON hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1));m_ImageList1.Add(hIcon);m_ImageNumber++;hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2));m_ImageList1.Add(hIcon);m_ImageNumber++;hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON3));m_ImageList1.Add(hIcon);m_ImageNumber++;.........//要播放的所有资源加入图像列表。}在OnCreate函数中设置计时器,并创建图像列表:
int CImageView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereCreateImageList();SetTimer(1,500,NULL);return 0;}响应ON_TIMER消息,显示动画:
void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif(m_Play>m_ImageNumber)m_Play=0;//如果图画为最后一个,显示第一幅图片CDC *pDC=this->m_wndStatusBar.GetDC();ASSERT(pDC!=NULL);pt1.x=1;pt1.y =1;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);m_Play++;CFrameWnd::OnTimer(nIDEvent);}上述代码将在状态条左上方播放动画。
3.2 工具栏上显示动画
由于工具栏的性质与状态条差不多,其播放动画的方法也相似。
ON_TIMER的响应函数:
void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif(m_Play>m_ImageNumber)m_Play=0;//如果图画为最后一个,显示第一幅图片CRect rect;CDC *pDC;pDC=this->m_wndToolBar.GetDC();ASSERT(pDC!=NULL);this->m_wndToolBar.GetClientRect(&rect);//获得显示有效区域pt1.x =rect.right -64; //将显示位置定在最右边pt1.y=1;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);m_Play++;CFrameWnd::OnTimer(nIDEvent);}上述代码将在工具栏右上方播放动画。但如仔细观察,动画的位置并不是靠近窗口
最右边,这是因为工具栏的窗口有边界,采用如下方法,可以把画面移到窗口右边:
pDC=GetDC ();//获得CMainFrame的画图设备指针ASSERT(pDC!=NULL);this->GetClientRect(&rect);pt1.x =rect.right-64 ;pt1.y=rect.top+3 ;m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);ReleaseDC(pDC);这是因为工具栏占据的位置属于CMainFrame的客户区。
3.3 窗口标题栏上动画
在CWnd类中有一个函数:
HICON SetIcon( HICON hIcon, BOOL bBigIcon );
可以改变窗进口的图标,所以您可以通过使用该函数不断的改变图标使图标动起来。
在OnTimer函数中加入下列代码:
SetIcon(m_ImageList1.ExtractIcon(m_Play),FALSE);
就可以使图标动起来。当然为了使程序工作的更好,最好重建一套图标资源。
- VC应用程序上引用动画的效果
- Launcher 上的动画效果
- 如何取消应用程序弹出的动画效果
- 如何取消应用程序弹出的动画效果
- Navigation上的BarButton添加动画效果
- Metro 风格应用程序中快速而流畅的动画效果
- VC如何作出有动画效果的托盘图标
- 王学岗的属性动画上(五)------抛物线效果的实现
- vc++6.0中AppWizard生成的应用程序框架分析(上)
- 点击页面上某个元素实现动画的滚动效果
- 弹出输入文本框上弹的动画效果
- 网页上制作动画效果的方法及优势劣势
- android进入应用程序时实现动画效果
- VC实现图片移动(动画效果)
- 【动画效果】改善subwindow的动画效果
- 应用程序运行时,动画的执行与代码的逻辑顺序不匹配,即指定控件未出现动画效果,而其他控件却出现动画效果
- VC应用程序的退出
- JavaFX的动画效果
- 总会在一起
- 展讯李力游:产业政策制定与实施应更关注设计业龙头
- 如何在eclipse jee中创建Maven project并且转换为Dynamic web project
- activity的启动模式和栈管理
- 【藏龙卧虎】成都传智播客Java就业班火爆开班!
- VC应用程序上引用动画的效果
- Java实现的苹果IAP二次验证主要逻辑
- java Integer和int之间==的比较问题
- restclient测试工具
- 二分匹配mark
- android中Invalidate和postInvalidate的区别
- cocosbuilder源代码分析
- vi 批量加注释‘#’
- Sping中使用单实例化简化多线程的相关实现 事务 模板 回调