GIF图像有多种显示方法。据我所知的有三种。
第一种:通过WEB Brower控件显示GIF图像(缺点:有滚动条,需要专门的祛滚动条。我这里有祛滚动条的Demo,需要的朋友请留言。)
第二种:就是我今天想要说的方法。CPictureEX类显示GIF(我看好这种方法,除了类比较大点,真的很好用。)
第三种:引用第三方控件。我只是听说过没有实际操作过这种方法。
我们来谈谈CPictureEX:
CPictueEx不仅可以显示GIF(包括GIF动画),还可以显示JPEG、BMP、WMF、ICO、CUR(所有OleLoadPicture能辨别的)。
基本接口如下:
BOOL Load(...) ――加载GIF 并筹备绘画对象;
BOOL Draw() ――绘制图像或继续动画显示。
void Stop() ――停滞动画;
void UnLoad() ―― 结束动画并释放所有资源;
void SetBkColor(COLORREF) ――为透明区域设置填充色彩;
COLORREF GetBkColor() ――获取当前填充色彩;
BOOL IsGIF() ―― 如果当前图像是 GIF 则返回 TRUE;
BOOL IsAnimatedGIF() ――如果当前图像是动画 GIF,则返回TRUE;
BOOL IsPlaying() ――如果当前图像是以动画方法显示则返回TRUE;
SIZE GetSize() ――返回图像尺寸。
int GetFrameCount() ――返回当前图像的帧数量;
BOOL GetPaintRect(RECT *lpRect) ――返回当前绘制的矩形。
BOOL SetPaintRect(const RECT *lpRect) ――设置当前绘制的矩形;
CPictureEX[Wnd]::Load 函数有三个版本:
BOOL Load(LPCTSTR szFileName);
该版本的Load函数从一个文件加载。返回类型表现加载是否胜利。
BOOL Load(HGLOBAL hGlobal, DWORD dwSize);
该版本的Load函数获取全局内存块句柄,用 GlobalAlloc 及 GMEM_MOVEABLE 标记分配内存。该函数不会释放分配的内存,所以不要忘却调用 GlobalFree。返回值表现加载是否胜利。
BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);
该函数获取图像资源名和资源类型,例如:
m_Picture.Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));
获取资源名和类型后加载对应的图像,并用 CPictureEx[Wnd]::Draw() 显示图像,如果图像是动画 GIF,该函数会启动一个背景处置线程完成动画显示,对于非动画 GIF,则用 OleLoadPicture/IPicture。显示。
任何时候ni都可以用 CPictureEx[Wnd]::Stop() 函数终止背景处理线程。如果你不仅想结束动画,还想释放所有资源,使用 CPictureEx[Wnd]::UnLoad() (CPictureEx[Wnd]::Load() 主动调用UnLoad() )。
缺省情形下,图像的背景是用 COLOR_3DFACE 填充的(对话框窗口的色彩),如果ni须要转变图像背景,调用 CPictureEx[Wnd]::Load()之后调用 CPictureEx[Wnd]::SetBkColor(COLORREF) 即可。
使用 CPictureEx[Wnd]::SetPaintRect(const LPRECT) 函数可以设置一个剪贴矩形,LPRECT 参数告知类它应当显示图像的哪一部分。如果不设置剪贴矩形,则显示整幅图像。
使用 Stop()/Draw() 可以结束动画GIF,调用Draw() 后可继续从停滞的那一帧继续显示。借助 IsPlaying() 函数,ni还可以知道当前是否在显示动画
下面我们用MFC来做个测试:
1:新建一个对话框工程(我这里是GIF),工程中加入PictureEx.h和PictureEx.cpp.这个类可以在网上下载到。
网址:http://d.download.csdn.net/down/1458419/tonypioneer
2:在你的对话框中加入一个静态文本控件(Static Text)或图片控件(Picture Control),Group Box也可以;
3:给控件的ID改个名字如IDC_PICTURE,并关联变量m_Picture;
4:在对话框的头文件中用CPictureEx替换CStatic,包含头文件#include "PictureEx.h";
5:在OnInitDialog(或者其他什么你喜欢的地方)加入下面的代码: if (m_Picture.Load(_T("mypicture.gif")))
m_Picture.Draw();
这样就可以了:
效果图如下:
有兴趣的朋友可以参考更多的资料:
http://vcer.net/1076417661390.html