146上位机VC MFC使用GDI+加载与显示GIF图片
146上位机VC MFC使用GDI+加载与显示GIF图片
功能展示
GIF动态图片也是我们电脑上常见的图片格式,VC并没有提供直接打开图片的函数,我们当前例程通过GDI+实现GIF图片的打开与显示,效果如图 要点提示 通过微软的GDI+能够快速轻松实现 打开GIF格式图片并将其以动画的形式显示; GDI+使用前,得下载微软的GDIPLUS支持包,可从微软的管网下载,我们这里给大家进行了打包; 然后是添加头文件再进行简单的初始化操作,在CWinApp派生类的InitInstance函数中进行此项工作是最好的;
实现功能 1.新建基于对话框的应用程序 2.使用前准备GDI+:将例程根目录Include文件夹复制到自己工程根目录。 在StdAfx.h头文件包含GDI+ 头文件及库文件//使用GDI+第一步 #define UNICODE #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "Include/gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "Include/gdiplus.lib") 在APP类的InitInstance()中进行初始化 //使用GDI+第二步 GdiplusStartupInputgdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL); 在程序退出时 进行GDI+ 环境的关闭
//使用GDI+第三步 GdiplusShutdown(gdiplusToken); //关闭gdiplus的环境 3,准备好GDI+后,便是使用GDI+ 加载GIF图片: 拖拽一按钮控件关联函数用于打开GIF图片,拖拽一静态文本控件,修改默认ID为IDC_DIREC,用于显示GIF图片路径; 4.添加两变量private: Bitmap* m_pBmp; //定义位图对象 intm_nFrameIndex; //记录当前显示帧索引 在OnInitDialog()函数中初始化 及设定一定时器;m_pBmp = NULL; SetTimer(1, 20, NULL); //开始一个计时器
5.添加定时器响应函数OnTimer() - void CGkbc8Dlg::OnTimer(UINT nIDEvent)
- {if (m_pBmp)//已打开GIF图片
- {
- int nDimCount = m_Bmp->GetFrameDimensionsCount();//获取帧维数
- GUID *pGuids = new GUID[nDimCount];//获取标识Dimension的GUID
- m_pBmp->GetFrameDimensionsList(pGuids, nDimCount);
- //获取第一个Dimension中的图像帧数
- int FrameCount = m_pBmp->GetFrameCount(pGuids);
- UINT nSize = 0;
- UINT nDelay = PropertyTagFrameDelay;
-
- m_pBmp->GetPropertySize(&nSize, &nDelay);//先计算属性相关数据的大小
- PropertyItem *pItem = NULL;
- pItem = (PropertyItem*)malloc(nSize);
- m_pBmp->GetAllPropertyItems(nSize, nDelay, pItem);
- nDelay = ((long*)pItem->value)[m_nFrameIndex];//获取每一帧的时间间隔
- free(pItem);
- delete [] pGuids;
- //显示图像帧
- Graphics graphic(GetDC()->m_hDC);
- graphic.DrawImage(m_pBmp, 0, 0, m_pBmp->GetWidth(), m_pBmp->GetHeight());
- if (m_nFrameIndex >= FrameCount - 1){m_nFrameIndex = 0;}
- GUID Guid = FrameDimensionTime;
- m_pBmp->SelectActiveFrame(&Guid, m_nFrameIndex++);
- }
- CDialog::OnTimer(nIDEvent);
- }
复制代码- 6.实现GIF图片打开的按钮功能
- void CGkbc8Dlg::OnOpen()
- {
- CFileDialog flDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- "Gif图片|*.gif||");
- if (flDlg.DoModal()==IDOK)
- {
- CString szFileName = flDlg.GetPathName();
- SetDlgItemText(IDC_DIREC,szFileName);
- m_pBmp = Bitmap::FromFile(szFileName.AllocSysString());
- if (m_pBmp != NULL)
- m_nFrameIndex = 0;
- }
- }
复制代码我们来演示下功能实现的整个过程
|