注册 登录
编程论坛 VC++/MFC

美化自己的对话框--MFC显示GIF动画图片

hlmzrdongdong 发布于 2009-11-25 16:15, 24863 次点击
如何让自己的对话框显得更加好看,增加一些动态元素,这是我专注于MFC之后忙着解决的问题。

在本论坛的本版块里,我陆续的发了两个这方面的帖子,列举如下:
1.如何创建XP风格的按钮控件 https://bbs.bccn.net/thread-292048-1-1.html
2.MFC显示Flash动画的编程实现 https://bbs.bccn.net/thread-292047-1-1.html

本帖则将讨论如何在MFC的对话框里显示GIF动画图片。一些关于传统控件的美化方法正在研究当中会陆续发帖的。

这是本帖用到的一个例程,声明一下是在VS2008下做的,VC6.0的朋友可能无法打开。
只有本站会员才能查看附件,请 登录


一.显示GIF图片控件类的介绍:

   无论是在VC6.0还是在VS2008中,都没有控件能显示GIF动画图片。能显示一些静态图片的只是Picture控件。本例程用到的GIF动画显示控件类是PictureEX。其定义文件是PictureEx.h,类的实现文件是PictureEx.cpp。有关该类的成员函数和方法说明如下:
程序代码:
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) ——设置当前绘制的矩形;

二.编程应用步骤:

    1.首先在网上下载两个小的GIF动画图片,由于VS2008无法识别这样的文件的扩展名,会弹出输入文件类型的扩展名,输入一个字符串即可。这个字符窜在后面的代码中会用到。

    2.建立一个对话框的MFC工程。将下载的资源文件拷贝至工程目录的Res文件夹下,然后用添加资源的方法将这两个资源文件加载到你的工程中。

    3.这一步非常重要。首先在我的例程里拷贝PictureEx.h和PictureEx.cpp到你的工程目录下,然后在将该类添加到你的工程中。

    4.在对话框面板上添加两个Picture控件分别给它们建立Control型的Static变量。我的例程里名字分别为m_gifpicture和m_girl。

    5.一切准备工作以经完成。下面是添加代码:

     在对话框类定义文件(我的例程是GifPictureDlg.h)中添加一句:
#include "PictureEx.h"   

    找到下面的两行:
 
   Cstatic m_gifpicture;
    Cstatic m_girl;

    将其改为:

    CPictureEx m_gifpicture;
    CPictureEx m_girl;

    在对话框的实现文件(我的例程是GifPictureDlg.cpp)中的对话框初始化函数BOOL CGifPictureDlg::OnInitDialog()中添加如下代码:

if (m_gifpicture.Load(MAKEINTRESOURCE(IDR_GIF1),_T("gif")))//IDR_GIF1是添加的GIF动画的ID号。gif即是在添加时所键入的文件类型
        m_gifpicture.Draw();
if (m_girl.Load(MAKEINTRESOURCE(IDR_GIF2),_T("gif")))
        m_girl.Draw();

    下面编译该工程并运行一下,可以看到GIF动画。我的运行结果如下(由于是截屏的所以没有动画效果):
只有本站会员才能查看附件,请 登录


[ 本帖最后由 hlmzrdongdong 于 2009-11-25 16:17 编辑 ]
72 回复
#52
rocday2013-01-06 09:53
感谢楼主分享,我使用您介绍的办法新建一个对话框,也是gif图片没有动画效果,重新导入图片也不行,很是奇异,请楼主不吝赐教。QQ:41682484.
#53
zjb10252013-01-18 14:54
楼主,高高手!
#54
老pan2013-05-29 17:29
感觉反应好几秒才出现动态图,这个有办法解决吗?
#55
sunypay2013-06-13 22:26
vs2010可以编译运行,却不能添加新的资源,否则只显示静态图片,无法动态播放,原来那两个倒是可以,为什么?
#56
wq2004078312013-07-12 19:30
第一次加入这个论坛,希望能与大家分享
#57
仰头的猪2013-08-01 10:19
回复 55楼 sunypay
图片好像要重新覆盖一次的,原来的动态图执行一次后,本身图片就变静态的了。我这边情况事这样,不知道你是不是也一样
#58
fc6_12013-09-05 08:55
确实可以,但是如果用非对话框的话怎么搞了,搞了好久都不行,毕竟非对话框没有DoDataExChange()
#59
仰头的猪2013-09-06 15:54
回复 58楼 fc6_1
[local]1[/local] 如果是在文档中显示的话可以参照这个例子,出处是visualC++从入门到精通的例子,用到GDI+知识点,我在vs2008中编译的[local]1[/local] 如果是在文档中显示的话可以参照这个例子,出处是visualC++从入门到精通的例子,用到GDI+知识点,我在vs2008中编译的
#60
zhangqi_gsts2013-10-05 21:58
不错,如果不动,可以用资源路径加载
#61
七月情殇2013-11-04 13:19
楼主威武!
#62
tonny_ren2014-07-09 14:52
楼主我爱你
#63
逍遥游exe2014-08-25 13:26
谢谢分享,最近正好要用到。。。
#64
逍遥游exe2014-08-25 13:26
谢谢分享,最近正好要用到。。。
#65
xiaopangyoyo2014-09-12 14:21
为什么我自己建的工程,也是按照这个流程,只能显示静态的呢。。但是打开你的工程你可以呢。。奇怪了都
#66
nkliukejin2015-07-15 14:35
fatal error LNK1136: invalid or corrupt file
连接头文件,编译之后出现erro
#67
gif12342015-10-24 12:33
谢谢楼主  对于学习很有帮助
#68
wutl20052015-11-19 22:22
s2010可以编译运行,却不能添加新的资源,否则只显示静态图片,无法动态播放,原来那两个倒是可以,为什么?
#69
kling2016-03-12 18:05
赞哦!!还没有试试,待会试试!赞!!!
#70
hitos2016-06-16 13:34
回复 7楼 scckj
我也有相同的问题 请问楼主解决了吗?
#71
zxs2333332017-11-29 23:09
翻车了 ,动图不动
#72
Anglsteel2021-08-31 14:09
回复 8楼 votvo
你看下    if (m_gif.Load(MAKEINTRESOURCE(IDR_GIF1),_T("gif")))
        m_gif.Draw();
这里的IDR_GIF1是不是跟你添加的GIF 的ID不一样
#73
Anglsteel2021-09-01 15:00
回复 7楼 scckj
把res里的图片换下,照片问题
12