GDI+显示gif动画ImageEx类

本文档介绍了如何使用 C++ 的 ImageEx 类来处理 GDI+ 中的 GIF 动画。ImageEx 类扩展了基类 Image,提供了构造图像、初始化动画、判断动画状态、暂停/恢复动画以及销毁动画等功能。通过调用 InitAnimation 函数,可以在指定窗口的客户区播放 GIF 并支持拉伸和镜像效果。此外,ImageEx 类在处理多帧动画时需要注意线程同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Code:
  1. // GDIPlusHelper.h: interface for the CGDIPlusHelper class.   
  2. //   
  3. //   
  4.   
  5. #if !defined(AFX_GDIPLUSHELPER_H__BD5F6266_5686_43E2_B146_5EA1217A56FE__INCLUDED_)   
  6. #define AFX_GDIPLUSHELPER_H__BD5F6266_5686_43E2_B146_5EA1217A56FE__INCLUDED_   
  7.   
  8. #if _MSC_VER > 1000   
  9. #pragma once   
  10. #endif // _MSC_VER > 1000   
  11.   
  12. #include <windows.h>   
  13.   
  14. //注意:此类当创建的图像对象是多帧动画时,没有考虑线程同步问题,不能在其他地方使用,   
  15. //比如所有的Graphics操作函数,以及从基类继承过来的接口函数,你只能使用ImageEx类的public接口函数;   
  16. //而当创建的是单帧图像时,线程同步性等价于基类Image的同步性,   
  17. //则你可以像以前使用Image类那样使用该类,包括所有的Graphics操作函数,以及从基类继承过来的接口函数。   
  18. //其实你会发现下面的public成员函数操作的成员变量都是新增的成员变量。   
  19.   
  20. class ImageEx : public Image   
  21. {   
  22. public:   
  23. //以长度为nSize的内存pBuff中的内容构造图像   
  24.     ImageEx(const void* pBuff, size_t nSize, BOOL useEmbeddedColorManagement = FALSE);   
  25. //以类型为sResourceType,名称为sResource的资源构造图像   
  26.     ImageEx(LPCTSTR sResourceType, LPCTSTR sResource, BOOL useEmbeddedColorManagement = FALSE);   
  27. //以文件构造图像   
  28.     ImageEx(LPCTSTR filename, BOOL useEmbeddedColorManagement = FALSE);   
  29. //调用Destroy成员函数   
  30.     ~ImageEx();   
  31. public:   
  32. //如果已经构造的对象是动画,则创建动画线程,并返回true,   
  33. //如果为静态图像或已经创建过动画线程,则也返回false   
  34. // 图像将绘制在m_hWnd客户区的rect区域,会拉伸,支持镜像   
  35.     bool InitAnimation(HWND hWnd, RECT rect);   
  36. //判断是否为动画   
  37.     bool IsAnimatedGIF() { return m_nFrameCount > 1; }   
  38. //设置动画暂停与否   
  39.     void SetPause(bool bPause);   
  40. //判断动画是否处于暂停状态   
  41.     bool IsPaused() { return m_bPause; }   
  42. //关闭动画,事实上基类Image中还有的两个成员变量没有关闭,因为析构函数会调用基类析构函数进行关闭的   
  43.     void Destroy();   
  44.   
  45. protected:   
  46. //测试图像是否为动画,是的话成员变量m_pPropertyItem将会malloc分配内存   
  47.     bool TestForAnimatedGIF();   
  48. //给所有成员变量初始化,构造函数中调用   
  49.     void Initialize();   
  50. //在客户区画出当前帧,返回值表示是否要退出线程函数   
  51.     bool DrawFrameGIF();   
  52. //把长度为nSize的内存pBuff中的内容创建为IStream流保存在类的m_pStream成员变量中,   
  53. //返回成功与否,不检查参数的非法性   
  54.     bool LoadFromBuffer(const void* pBuff, size_t nSize);   
  55. //装载名称为lpName,类型为lpType的资源到pResource中,返回装载成功与否。   
  56. //nBufSize表示pResource缓存的长度。pResource为NULL时,nBufSize返回所需内存大小,   
  57. //不为NULL时,返回实际资源大小,长度不够时,相当于pResource为NULL时的作用,只是返回值为false。   
  58.     bool GetResource(LPCTSTR lpName, LPCTSTR lpType, void* pResource, size_t& nBufSize);   
  59. //装载类型为sResourceType,名称为sResource的资源到流对象成员变量m_pStream中,返回装载成功与否,   
  60. //m_pStream在该函数中装载成功与否保存在成员变量m_bIsInitialized中,   
  61. //同时,如果该类的对象是以文件构造的,则m_bIsInitialized表示构造成功与否   
  62.     bool Load(LPCTSTR sResourceType, LPCTSTR sResource); //类型,名字   
  63. //实际的线程函数   
  64.     void ThreadAnimation();   
  65. //代理线程函数,实际调用ThreadAnimation成员函数   
  66.     static UINT WINAPI _ThreadAnimationProc(LPVOID pParam);   
  67.   
  68. protected:   
  69.     IStream*        m_pStream; //记得Release   
  70.     HANDLE          m_hThread; //线程创建时是挂起的,须调用ResumeThread   
  71.     HANDLE          m_hPause; //手工重置,初始有信号   
  72.     HANDLE          m_hExitEvent; //手工重置,初始无信号   
  73.     HINSTANCE       m_hInst;   
  74.     HWND            m_hWnd;   
  75.     UINT            m_nFrameCount;   
  76.     UINT            m_nFramePosition;   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值