让程序的图标动起来 雍华夫 2001年 41期 在大家常用的软件如超级解霸、Norton AntiVirus中,我们会看到这些软件的控制图标是动画的,这些动画的图标十分形象地反映了程序的功能和运行状况。那么,我们也能在自己的程序中实现这样的功能吗?回答是:不但行而且非常容易!现在,就让我们以VC++ 6.0为例编一个让图标动起来的程序吧。   在编写程序之前,我们先来了解一下动画的原理。大家都知道动画是利用视觉延时原理由一幅幅静态的图像经过连续播放而动起来的,因此我们只需要把程序的图标不停地按一定时间间隔变换就行了(图标的数量和间隔时间视你的需要而定)。主要要做的工作有:1.画出多个图标;2.设置计时器让程序每隔一定时间自动变换图标。下面就让我们一步一步地实现程序。   首先,启动VC++ 6.0,使用MFC AppWizard(exe)新建一个名为Sample的工程,在这里我们以多文档应用程序为例,在AppWizard中不改变默认值,直接按Finish按钮即可。接下来,在WorkSpace中选中ResourceView,添加3个图标,其ID为IDI_ICON1、IDI_ICON2、IDI_ICON3,图标的内容分别为字母A、B、C。   接下来,在CMainFrame类中定义两个私有成员数据。其中,m_ahIcon数组用于存放3个图标的句柄,m_nPos用来指示当前应该使用的图标的句柄在m_ahIcon中的位置:   HICON m_ahIcon[3];   int m_nPos;   第三步我们在CMainFrame::OnCreate成员函数中将图标的句柄装入m_ahIcon数组并初始化m_nPos同时将程序在任务栏上的图标设为第一个图标:   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)    {   ..............   m_haIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);   m_haIcon[1]= AfxGetApp()->LoadIcon(IDI_ICON2);   m_haIcon[2]= AfxGetApp()->LoadIcon(IDI_ICON3);   m_nPos = 0;   SetIcon(m_haIcon [m_nPos++]TRUE);   return(0)   }   第四步,我们需要用ClassWizard为CMainFrame类生成一个消息响应函数OnTimer以便接收WM_TIMER消息,OnTimer函数的功能是循环地更换并显示3个图标:   void CMainFrame::OnTimer(UINT nIDEvent)   {   if(m_nPos==3)   m_nPos = 0;   SetIcon(m_haIcon [m_nPos++]TRUE);   CMDIFrameWnd::OnTimer(nIDEvent);   }   第五步,在CMainFrame::OnCreate函数中设置一个计时器,使程序每隔1000毫秒自动调用OnTimer函数改变一次图标:   SetTimer(1,1000,NULL);   最后不要忘记用ClassWizard为CMainFrame类生成DestroyWindow函数,以便程序退出时取消计时器:   BOOL CMainFrame::DestroyWindow   {   KillTimer(1);   return CMDIFrameWnd::DestroyWindow   }   做完上面的工作,我们就可以运行程序了。瞧,程序的图标真的动起来了。