翻译来源: https://www.codeproject.com/Articles/1427/Add-GIF-animation-to-your-MFC-and-ATL-projects-wit
作者:Oleg Bykov
这个类很常见,在很多源码中都有见到。
MFC用PictureEx.cpp和PictureEx.h
之前用到过的案例:对话框背景图六种方法-PictureEx类实现对话框背景图和xSkinButton类实现按钮样式
下面关于PictureEx类的链接已断,请移步PictureEx类下载
介绍
CPictureEx
是MFC 项目组编写的
需要支持JPEG和GIF格式的标题。使用OleLoadPicture
功能和界面不会显示静态横幅IPicture
,但处理动画GIF是一个完全不同的故事。
通过大量互联网链接,我发现只有一个可用的选项 - 乔治·特拉萨科夫在CodeGuru上的COM对象。不幸的是,显示我的一些测试GIF有问题。当然,我可以买一个第三方库,但在这种情况下,我会支付额外的功能(我实际上并不需要)。我决定试一试,写自己的类。基本思想是分割一个GIF成单独的帧,并且显示与所熟悉的组合帧OleLoadPicture
和IPicture
。在阅读完GIF87a和GIF89a的规格后,我写了我提请你注意的课程。请注意,CPictureEx
不仅可以显示GIF(包括动画GIF),还可以显示JPEG,BMP,WMF,ICO和CUR(也就是说,OleLoadPicture
一切都知道)。后来,我写了一个ATL版本的课程。
如何使用MFC版本(CPictureEx)
在对话框中添加一个静态文本或图片控件(组框也可以做到这一点); 将该控件的ID更改为类似的IDC_MYPICTURE
; 使用ClassWizard将一个成员变量(例如m_Picture
)与添加的控件相关联,Category - Control,Variable type - CStatic
; 在对话框的头文件中,将变量类型替换CStatic
为CPictureEx
(不要忘记#include "PictureEx.h"
并将PictureEx.h和PictureEx.cpp添加到项目中); 在OnInitDialog
(或任何你喜欢的地方),添加以下行:
if (m_Picture.Load(_T("mypicture.gif"))) m_Picture.Draw();
坐下来享受动画:)
你也可以将CPicture
作为标准CStatic
,并通过调用手动创建它(你必须,如果你的主机窗口不是对话框)CPictureEx::Create()
,然后CPictureEx::Load
和CPictureEx::Draw
。
如何使用ATL版本(CPictureExWnd)
要使用ATL-version(CPictureExWnd
),请按照相同的步骤操作,而不是使用ClassWizard,手动CPictureExWnd
在类中添加一个类型的变量,并将以下代码添加到WM_INITDIALOG
处理函数中:
HWND hWnd = GetDlgItem(IDC_MYPIC);
if (hWnd) m_wndBanner.SubclassWindow(hWnd);
之后,你可以打电话CPictureExWnd::Load()
和CPictureExWnd::Draw()
。当然,你也可以CPictureExWnd::Create
直接调用- CPictureExWnd
只是另一个窗口在窗口过程中有一些额外的功能。
接口功能
BOOL Load(...)
- 加载GIF并准备一个对象进行绘图;BOOL Draw()
- 绘制图片或继续动画;void Stop()
- 停止动画;void UnLoad()
- 停止动画并释放所有资源;void SetBkColor(COLORREF)
- 设置透明区域的填充颜色;COLORREF GetBkColor()
- 获取当前填充颜色;BOOL IsGIF()
-TRUE
如果当前图片是GIF;BOOL IsAnimatedGIF()
-TRUE
如果当前图片是动画GIF;BOOL IsPlaying()
-TRUE
如果当前图片显示动画;SIZE GetSize()
- 返回图片尺寸;int GetFrameCount()
- 返回当前图片中的帧数;BOOL GetPaintRect(RECT *lpRect)
- 返回当前绘制矩形;BOOL SetPaintRect(const RECT *lpRect)
- 设置当前绘制矩形;
CPictureEx[Wnd]::Load
有三个版本可用:
BOOL Load(LPCTSTR szFileName);
该版本从文件加载图片szFileName
。函数的返回类型表示加载的成功。
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,该功能将产生一个后台线程来执行动画; 如果是静态图片,它将立即显示OleLoadPicture
/ IPicture
。您可以随时使用该CPictureEx[Wnd]::Stop()
功能停止生成的线程。如果您不仅要停止动画,还要释放所有资源,请使用CPictureEx[Wnd]::UnLoad()
(自动CPictureEx[Wnd]::Load()
调用UnLoad()
)。
默认情况下,图片的背景填充COLOR_3DFACE
(对话窗口的背景颜色)。如果您需要更改图片的背景信息,请CPictureEx[Wnd]::SetBkColor(COLORREF)然后
CPictureEx[Wnd]::Load()
。