VC++实现输出GIF到窗体并显示GIF动画的方法
本文讲述了VC++在窗体中显示GIF动画的方法,这是主要代码部分,在这段代码中,VC++将使用GDI技术加载GIF图像,定义GUID数组、定义指针、初始化各成员变量、释放属性对象、释放GUID等资源等。
代码如下:
//加载GIF文件
voidCOutputGIFDlg::OnBrowse()
{
CFileDialogflDlg(TRUE,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"GIF|*.gif;||");//定义文件打开对话框
if(flDlg.DoModal()==IDOK)
{
CStringszText;
szText=flDlg.GetPathName();
m_FileName.SetWindowText(szText);
m_pBmp=Bitmap::FromFile(szText.AllocSysString());//加载GIF图像
szText.ReleaseBuffer();
m_nCount=m_pBmp->GetFrameDimensionsCount();//获取帧维数
GUID*pGuids=newGUID[m_nCount];//定义一个GUID数组
m_pBmp->GetFrameDimensionsList(pGuids,m_nCount);//获取图像帧的GUID
m_FrameCount=m_pBmp->GetFrameCount(pGuids);//获取GIF帧数
UINTnSize;//定义一个整型变量
m_nCount=0;//初始化成员变量
m_pBmp->GetPropertySize(&nSize,&m_nDelay);//获取属性大小
PropertyItem*pItem=NULL;//定义属性指针
pItem=(PropertyItem*)malloc(nSize);//为属性指针分配合适的空间
m_pBmp->GetAllPropertyItems(nSize,m_nDelay,pItem);//获取属性信息
m_nDelay=((long*)pItem->value)[0];//获取第一帧的延时
free(pItem);//释放属性对象
delete[]pGuids;//释放GUID
m_nIndex=0;//初始化成员变量
KillTimer(1);
SetTimer(1,300,NULL);
}
}
voidCOutputGIFDlg::OnTimer(UINTnIDEvent)
{
GUIDGuid=FrameDimensionTime;//定义一个GUID
CDC*pDC=GetDC();//获取窗口的设备上下文
//定义一个内存画布
CMemDCdc(pDC,CRect(20,50,m_pBmp->GetWidth()+20,m_pBmp->GetHeight()+50));
Graphicsgh(dc.m_hDC);//定义一个图像对象
//向设备上下文中绘制图像
gh.DrawImage(m_pBmp,0,0,m_pBmp->GetWidth(),m_pBmp->GetHeight());
m_pBmp->SelectActiveFrame(&Guid,m_nIndex++);//设置下一帧
if(m_nIndex==m_FrameCount)//判断当前帧是否为尾帧
m_nIndex=0;//将当前帧设置为第一帧
CDialog::OnTimer(nIDEvent);
}
voidCOutputGIFDlg::OnCancel()
{
if(m_pBmp!=NULL)
{
deletem_pBmp;
m_pBmp=NULL;
}
CDialog::OnCancel();
}