在头文件里面添加:

Image* image;
GUID Guid ;
UINT frameCount;
UINT framePos;
ULONG_PTR gdiplusToken; afx_msg void OnTimer(UINT_PTR nIDEvent);
void LoadGif();

需要依赖头文件:

#include <Gdiplusheaders.h>
#include <Gdiplus.h> using namespace Gdiplus;

界面类的构造函数里面添加:

//启动gdi 要不然 Image::FromFile 会失败
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); image = NULL;
frameCount = ;
framePos = ;

添加定时器消息处理:

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON2, &CMFCApplication1Dlg::OnBnClickedButton2)
END_MESSAGE_MAP()

加载GIF文件:

void CMFCApplication1Dlg::LoadGif()
{
WCHAR strModule[MAX_PATH * ] = { };
GetModuleFileNameW(NULL, strModule, MAX_PATH * );
::PathRemoveFileSpecW(strModule);
wsprintfW(strModule + wcslen(strModule), L"\\%s.gif", L"sVcodec"); image = Image::FromFile(strModule); //获得有多少个维度,对于gif就一个维度
UINT count = image->GetFrameDimensionsCount();
GUID *pDimensionIDs = (GUID*)new GUID[count];
image->GetFrameDimensionsList(pDimensionIDs, count);
WCHAR strGuid[];
StringFromGUID2(pDimensionIDs[], strGuid, );
frameCount = image->GetFrameCount(&pDimensionIDs[]); //delete[] pDimensionIDs; //获得各帧之间的时间间隔
//先获得有多少个时间间隔,PropertyTagFrameDelay是GDI+中预定义的一个GIG属性ID值,表示标签帧数据的延迟时间
UINT FrameDelayNums = image->GetPropertyItemSize(PropertyTagFrameDelay);
PropertyItem* lpPropertyItem = new PropertyItem[FrameDelayNums];
image->GetPropertyItem(PropertyTagFrameDelay, FrameDelayNums, lpPropertyItem); Guid = FrameDimensionTime;
image->SelectActiveFrame(&Guid, framePos); }

定时器处理:

void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
if (image)
{
CWnd* pic = GetDlgItem(IDC_STATIC_PIC);
Graphics gh(pic->GetDC()->m_hDC); CRect rect;
GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);
gh.DrawImage(image, , , rect.Width(), rect.Height());
//gh.DrawImage(image, 0, 0, image->GetWidth(), image->GetHeight()); //设置当前需要显示的帧数
image->SelectActiveFrame(&Guid, framePos);
framePos++;
if (framePos == frameCount)
{
framePos = ;
}
} CDialogEx::OnTimer(nIDEvent);
}

启动定时器:

SetTimer(, , NULL);

    LoadGif();

需要依赖gdi 库:

gdiplus.lib

参考地址:https://blog.csdn.net/sz76211822/article/details/51507616

================================================================

VC2010使用GDI+在picture control控件里面显示图片

一、头文件添加

在项目的stdafx.h头文件里面添加如下头文件说明。

#include <gdiplus.h>    // GDI+库头文件,并在App头文件中声明相关变量
using namespace Gdiplus;

二、lib文件添加

项目-xx属性-链接器-输入-附加依赖性:输入gdiplus.lib

三、App文件对使用GDI+的初始化

xx.h头文件定义:ULONG_PTR m_gdiplusToken;

xx.cpp中在

BOOL CXXApp::InitInstance()

{

      //添加GDI+初始化说明

      // GDI+相关启动操作

      GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); }

四、打开图片操作函数

bool XX::ShowImageInBoxEC(CString pathname)
{
CWnd* pic = GetDlgItem(IDC_PIC_VIEW);    // 用此句,得到图片控件的CWnd,图片将被绘制在控件上,IDC_PIC_VIEW为picture control的控件ID
Graphics graphics(pic->GetDC()->m_hDC); Image tempimage(pathname);
CRect rect;
GetDlgItem(IDC_PIC_VIEW)->GetClientRect(&rect); graphics.DrawImage(&tempimage, , , rect.Width(), rect.Height()); return TRUE;
}

参考:https://blog.csdn.net/fengdingha/article/details/19479289

MFC GDI+显示GIF文件《转》的更多相关文章

  1. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  2. MFC对话框显示BMP图片

    1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...

  3. MFC【6】文件I/O和串行化

    文件输入和输出(I/O)服务是所有操作系统的主要工作.Microsoft Windows提供了各种API函数用来读.写和操作磁盘文件.MFC将这些桉树和CFile类融合在面对对象的模型里.其中CFil ...

  4. EasyPlayerPro Windows播放器全屏模式下GDI显示出现黑屏问题解决

    问题来源 2017.12.21 前天有杭州某教育领域客户反馈有部分视频源在全屏模式下显示黑屏: 问题复现 EasyPlayerPro由于没有实现单个窗口完全全屏,故没有暴露该问题,晚上加班,加上单个窗 ...

  5. MFC上显示摄像头JPEG图片数据的两种方法

    其一是借助opencv,其二是利用流对象. 方法一: CvMat *mat; ,,CV_8UC1); ,,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像 ...

  6. 利用FlashPaper在web页面中显示PDF文件(兼容各浏览器)

    应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用<embed/>元素放入PDF文件,但是效果不理想,浏览器兼容不理想,在ie9/8(其他版本没有测试)显示会提示下载pdf文件 ...

  7. HTML input="file" 浏览时只显示指定文件类型 xls、xlsx、csv

    html input="file" 浏览时只显示指定文件类型 xls.xlsx.csv <input id="fileSelect" type=" ...

  8. linux 如何显示一个文件的某几行(中间几行)

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  9. 转: Eclipse 分屏显示同一个文件

    Eclipse 分屏显示同一个文件   场景 : 某个类很大,可能有数千行.当你想要将类开头部分与中间或者靠后的部分进行对比时,请follow如下步骤: Window -> Editor -&g ...

随机推荐

  1. excel合并日期和时间(转载)

    https://jingyan.baidu.com/article/d3b74d641669361f77e60914.html =TEXT(A2,"YYYY/M/D")&& ...

  2. Vue 默认IIS站点配置

    // Vue 默认IIS站点配置 module.exports = { baseUrl: '/SG/',  }

  3. 使用gdb调试应用程序

    目录 一.gdb基本使用 1. 启动gdb 2. gdb交互式命令 一.gdb基本使用 ​ GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. ...

  4. SQL SERVER-日期按时区转换

    SELECT SWITCHOFFSET('2019-07-19 08:35:06.637','+08:00')

  5. 【DRF框架】认证组件

    DRF框架的认证组件 核心代码:       self.perform_authentication(request)  框架自带模块:    from rest_framework import a ...

  6. vue 关于props 父组件传值

    swiper.vue  子组件 info.vue 父组件 swiper.vue<template> <div class="swiper-wrap" @mouse ...

  7. MQ的面试题

    MQ的优点和缺点? 优点:解耦 异步,削峰 解耦: 所以需要用来解耦: 异步: 解决方法: 削峰: 解决方法是: 缺点:降低高可用性.增加系统的复杂程度.一致性问题 降低高可用的原因:系统引入的外部依 ...

  8. CH6803 导弹防御塔

    6803 导弹防御塔 0x60「图论」例题 背景 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛l ...

  9. c语言中字符串转数字的函数

    ANSI C 规范定义了 atof().atoi().atol().strtod().strtol().strtoul() 共6个可以将字符串转换为数字的函数,大家可以对比学习.另外在 C99 / C ...

  10. Apollo简介及工作原理

    一.Apollo简介 1.Apollo是携程框架部门研发的分布式配置中心 2.集中化管理应用的不同环境和不同集群的配置 3.配置修改后能够实时推送到应用端 4.具备规范的权限.流程治理等特性 二.Ap ...