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

翻译来源: 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成单独的帧,并且显示与所熟悉的组合帧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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误通常是因为链接器无法找到对象文件或库文件实现 `CPictureEx::Draw()` 方法的代码。你可以尝试检查以下几个方面: 1. 确认 `CPictureEx::Draw()` 方法是否在你的代码定义和实现了。如果没有定义或者实现,链接器就会报这个错误。 2. 确认你的代码是否包含了 `CPictureEx::Draw()` 方法的声明。如果没有声明,编译器就无法识别这个方法。 3. 确认你的项目是否引用了包含 `CPictureEx::Draw()` 方法实现的库文件。如果没有引用,链接器就无法找到这个方法的实现代码。 如果以上步骤都确认无误,你可以尝试重新编译和链接你的项目,或者检查一下编译器和链接器的设置是否正确。如果还是无法解决问题,你可以尝试搜索一下类似的问题,或咨询相关领域的专业人士。 ### 回答2: 这个错误信息是一个编译错误,它意味着在编译CPictureEx类的过程,无法找到与其Draw函数的实现相关联的符号。 这种错误通常发生在以下几种情况下: 1. Draw函数的定义被遗漏或者没有实现。在CPictureEx类的定义,声明了一个名为Draw的公共函数,但编译器无法找到该函数的实现代码。 解决方法:确认是否在CPictureEx类的定义文件实现了Draw函数,并且在编译的时候包含了该文件。 2. Draw函数的命名错误。编译器无法找到与声明的Draw函数完全匹配的函数定义。 解决方法:检查Draw函数的声明和实现是否完全一致,包括参数列表、返回值类型和修饰符。 3. Draw函数位于与编译器编译顺序不一致的文件。也就是说,在编译使用Draw函数的文件之前,编译器无法找到Draw函数的实现所在的文件。 解决方法:确保Draw函数的实现所在的文件在使用它的文件之前进行编译,或者使用前向声明来提供一个函数的占位符。 总之,要解决这个错误,需要检查Draw函数的定义和使用是否一致,确保所有需要的文件都被编译,并且按照正确的顺序进行。 ### 回答3: 这个错误信息是指在程序,使用了一个叫做"CPictureEx"的类的对象的Draw()方法,但是编译器在链接阶段找不到该方法的实现。这个错误通常发生在程序调用了函数或方法,但是没有将函数或方法的实现代码链接到目标文件。 要解决这个问题,我们可以尝试以下几种方法: 1. 确保在所有调用Draw()方法的地方正确地包含了CPictureEx类的头文件,以便编译器可以知道这个类的存在和方法的声明。 2. 检查是否在CPictureEx类的定义正确地实现了Draw()方法。确保方法名和参数列表与函数的声明一致。 3. 确保在链接阶段将实现Draw()方法的源文件(.cpp文件)包含到了编译器的项目或makefile。否则,编译器将无法找到方法的实现代码。 4. 如果CPictureEx类来自于外部的库或模块,可能需要在项目添加相应的库文件或模块依赖,以确保链接器可以正确地找到并链接必要的代码。 5. 如果使用了一些第三方库,可能需要在链接器的设置添加相应的库文件目录以及库文件名,以使链接器能够正确地解析和链接库的符号。 通过以上的检查和调整,通常可以解决"unresolved external symbol"这个错误,使得程序能够成功构建和链接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值