像列表:
int CImageView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CreateImageList();
SetTimer(1,500,NULL);
return 0;
}
响应ON_TIMER消息,显示动画:
void CImageView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
if(m_Play>m_ImageNumber)
m_Play=0;
m_ImageList1.Draw(pDC,m_Play,pt1,ILD_TRANSPARENT);
m_Play++;
ReleaseDC(pDC);
CView::OnTimer(nIDEvent);
}
最后别忘了在OnDestroy函数中,增加在窗口撤销时中止定时器的代码。
2、在状态条上显示动画
由于状态条也是窗口,所以也可以在其上显示动画。状态条时主窗口的子窗
口,在CMainFrame类中可以看到下列代码:
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
所以为了在状态条上显示动画,其编程代码应在CMainFrame类中加入。首先创建
资源文件和图像列表类,具体方法和代码见View类客户区绘制动画一节,此处不再重
复。下面进给出ON_TIMER的响应函数:
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(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);
}
上述代码将在状态条左上方播放动画。
三、在工具栏上播放动画
由于工具栏的性质与状态条差不多,其播放动画的方法也相似,下面进给出
ON_TIMER的响应函数:
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(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的客户区。
4、使图标变成动画
在CWnd类中有一个函数
HICON SetIcon( HICON hIcon, BOOL bBigIcon );
可以改变窗进口的图标,所以您可以通过使用该函数不断的改变图标使图标
动起来,效果像GetRight一样。 在OnTimer函数中加入下列代码:
SetIcon(m_ImageList1.ExtractIcon(m_Play),FALSE);
就可以使图标动起来,当然为了使
程序工作的更好,您最好重建一套图标资源。
在VC中另一可以改变图标的函数是SetClassLong(),又兴趣的朋友可以一试。