关闭

CPictureEx和CPictureExWnd类,将GIF动画添加到MFC和ATL项目中

标签: gif
375人阅读 评论(0) 收藏 举报
分类:

翻译来源: https://www.codeproject.com/Articles/1427/Add-GIF-animation-to-your-MFC-and-ATL-projects-wit

作者:

这个类很常见,在很多源码中都有见到。

MFC用PictureEx.cpp和PictureEx.h


之前用到过的案例:对话框背景图六种方法-PictureEx类实现对话框背景图和xSkinButton类实现按钮样式

下面关于PictureEx类的链接已断,请移步PictureEx类下载

样品图像

介绍

CPictureEx是MFC 项目组编写的

需要支持JPEG和GIF格式的标题。使用OleLoadPicture功能和界面不会显示静态横幅IPicture,但处理动画GIF是一个完全不同的故事。

通过大量互联网链接,我发现只有一个可用的选项 - 乔治·特拉萨科夫在CodeGuru上COM对象不幸的是,显示我的一些测试GIF有问题。当然,我可以买一个第三方库,但在这种情况下,我会支付额外的功能(我实际上并不需要)。我决定试一试,写自己的类。基本思想是分割一个GIF成单独的帧,并且显示与所熟悉的组合帧OleLoadPictureIPicture在阅读完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在对话框的头文件中,将变量类型替换CStaticCPictureEx(不要忘记#include "PictureEx.h"并将PictureEx.hPictureEx.cpp添加到项目中); OnInitDialog(或任何你喜欢的地方),添加以下行:

if (m_Picture.Load(_T("mypicture.gif")))
    m_Picture.Draw();

坐下来享受动画:)

你也可以将CPicture作为标准CStatic,并通过调用手动创建它(你必须,如果你的主机窗口不是对话框)CPictureEx::Create(),然后CPictureEx::LoadCPictureEx::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将获得一个分配给GlobalAllocGMEM_MOVEABLE标志的全局内存块的句柄该功能不会释放内存,所以不要忘记GlobalFree它。返回值表示加载的成功。

BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);

该函数获取具有图片的资源的名称和该资源类型的名称。例如:

m_Picture.Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));

加载图片后,用CPictureEx[Wnd]::Draw()功能显示如果图片是动画GIF,该功能将产生一个后台线程来执行动画; 如果是静态图片,它将立即显示OleLoadPictureIPicture您可以随时使用该CPictureEx[Wnd]::Stop()功能停止生成的线程如果您不仅要停止动画,还要释放所有资源,请使用CPictureEx[Wnd]::UnLoad()(自动CPictureEx[Wnd]::Load()调用UnLoad())。

默认情况下,图片的背景填充COLOR_3DFACE(对话窗口的背景颜色)。如果您需要更改图片的背景信息,请CPictureEx[Wnd]::SetBkColor(COLORREF)然后CPictureEx[Wnd]::Load()


0
0
查看评论

MFC用CPictureEx加载GIF动画

总结用CPictureEx加载gif动画的两种方法。
  • u012234115
  • u012234115
  • 2014-06-26 21:55
  • 3707

在MFC和ATL工程中加入GIF动画(CPictureEx,CPitureExWnd)

一、怎样使用MFC版的CPictureEx:   1、你的对话框中加入一个静态文本控件(Static Text)或图片控件(Picture Control),Group Box也可以;    2、给控件的ID改个名字如...
  • ccfxue
  • ccfxue
  • 2016-05-23 15:02
  • 505

CPictureEx类使用说明

CPictueEx类的话,可在点击打开链接下载. CPictueEx不仅可以显示GIF(包括GIF动画),还可以显示JPEG、BMP、WMF、ICO、CUR. 新建一个基于对话框的工程。   给你的对话框中加入一个静态文本控件(Static Text)或者图片控件(Picture Co...
  • qq0824
  • qq0824
  • 2016-10-19 16:59
  • 958

ATL和MFC创建ActiveX控件的区别

ATL和MFC创建ActiveX控件的区别 ATL和MFC创建ActiveX控件的区别 在visual C++ 6.0中,ATL和MFC代表了两种不同的框架,分别面向不同类型的基于Windows的开发。ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码;MFC代表了创建独...
  • ljh081231
  • ljh081231
  • 2014-04-11 10:18
  • 4676

CPictureEx图片类

//第一步:包含文件 //第二步:包含头文件 #include "PictureEx.h" //第三步:定义 CPictureEx m_pic; //第四步:创建 m_pic.Create(_T(""),SS_CENTER|WS_VISIBLE|...
  • wangjieest
  • wangjieest
  • 2011-12-19 20:12
  • 2197

CRT、ATL、MFC 三者介绍和关系

转载地址:http://hi.baidu.com/catro/item/115099c46917edc4994aa0ed CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行。后来在此基础上开发了C++ Runtime Library,所以现在CRT是...
  • memeai
  • memeai
  • 2014-02-27 10:46
  • 2531

ATL与MFC中的CString

       在ATL和MFC中都可以使用CString类来处理字符串,如果在MFC中要使用ATL中的CString,需要使用名字空间ATL::CString。在书写中,可以使用CStringT,CStringA,CStringW三种格式,...
  • Richard_Sky_Sun
  • Richard_Sky_Sun
  • 2010-08-16 10:50
  • 2262

什么是ATL? (与COM的关系,及MFC与COM的关系)

什么是ATL (与COM的关系,及MFC与COM的关系)   自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同...
  • whatday
  • whatday
  • 2012-04-26 14:48
  • 1295

混用ATL MFC WTL的问题-CString的冲突

主      题: 混用ATL MFC WTL的问题-CString的冲突 作      者: mc_ 回复次数: 3 发表时间: 2010-3-14 12:42:33...
  • xelone
  • xelone
  • 2011-09-09 13:56
  • 2539

Visual Studio中 ATL CLR MFC Win32 区别

ATL用于编写COM程序, CLR是.NET的公共语言运行库, MFC是指MFC类库,MFC程序是用这些类库做出的程序, WIN32常规就是不用MFC,使用API函数编的程序。  MFC、ATL和CLR是VC2005内置的3大库,涵盖了windows的各种开发方法和开发应用。当然关于C++...
  • kobesdu
  • kobesdu
  • 2014-12-19 10:01
  • 2284
    个人资料
    • 访问:105622次
    • 积分:2147
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:15篇
    • 译文:21篇
    • 评论:4条
    最新评论