基于GDI+的gif ActiveX控件(ATL)

MFC Picture控件图像显示全解析:静态与动态加载的四种实现方案 在Windows桌面应用开发中,图形设备接口(GDI)是图形显示的核心基础,它定义了应用程序与图形硬件之间的通信协议。其原理在于通过设备上下文(DC)抽象层,管理绘图表面与资源对象(如位图、画刷),实现图形输出的标准化。这一机制的技术价值在于提供了跨设备的图形编程接口,使得界面渲染、数据可视化等需求得以高效实现。在MFC框架的工程实践中,对话框Picture控件作为GDI的典型应用场景,常被用于仪器面板、数据监控等嵌入式上位机软件的图像展示。针对静态资源嵌入与动态文件加载两种常见需求,开发者可通过控件属性绑 阅读详情

本文给出一个基于gdi+的gif ActiveX控件的主要实现源码。本控件虽然冠名为gif,实际上可以用于显示多种格式的图像文件,bmp,jpeg,gif等等。由于时间关系,不多说明,同时只给出主要代码。

1. CTimeWnd

TimeWnd.h
------------------------------------------
#ifndef X_TIMEWND__H
#define X_TIMEWND__H

#include <atlbase.h>
#include <atlwin.h>
#include <map>

class CGifCtrl ;

class CTimeWnd : public CWindowImpl<CTimeWnd>
{
public:

 static CWndClassInfo& GetWndClassInfo()
 {
  static CWndClassInfo wc =
  {
   { sizeof(WNDCLASSEX), CS_VREDRAW|CS_DBLCLKS,
    StartWindowProc, 0, 0, 0,
    NULL,
    0,
    (HBRUSH)CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)),
    0,
    NULL,
    0 },
    NULL, NULL, IDC_ARROW, TRUE, 0, ""
  };
  return wc;
 }

 BEGIN_MSG_MAP(CTimeWnd)
  MESSAGE_HANDLER(WM_TIMER, OnTimer)
  MESSAGE_HANDLER(WM_CLOSE, OnClose)
 END_MSG_MAP()

 CTimeWnd():m_cur_timerid(0)
 {
 }

 ~CTimeWnd()
 {
 }

 LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

 LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 {
  PostMessage(WM_QUIT);
  return 0;
 }

 void set_timer(CGifCtrl *pGif , DWORD nIDEvent);
 void kill_timer(CGifCtrl *pGif);
 void unregister_timer(CGifCtrl *pGif);

private:

 DWORD m_cur_timerid ;
 std::map<DWORD,CGifCtrl *> m_timer_map ;

};

extern CTimeWnd gTimerWnd ;

#endif//X_EMOTION_DISPLAY__H

TimeWnd.cpp
----------------------------------------

#include <stdafx.h>
#include "TimerWnd.h"
#include "GifCtrl.h"

CTimeWnd gTimerWnd ;

void CTimeWnd::set_timer(CGifCtrl *pGif , DWORD nIDEvent)
{
 if(pGif->get_timerId() == 0xFFFFFFFF)
 {
  pGif->set_timerId(this->m_cur_timerid++);
  m_timer_map[pGif->get_timerId()] = pGif;
 }

 SetTimer(pGif->get_timerId(),nIDEvent,NULL);
}

void CTimeWnd::kill_timer(CGifCtrl *pGif)
{
 if(pGif->get_timerId() != 0xFFFFFFFF)
 {
  KillTimer(pGif->get_timerId());
 }
}

void CTimeWnd::unregister_timer(CGifCtrl *pGif)
{
 if(pGif->get_timerId() != 0xFFFFFFFF)
 {
  KillTimer(pGif->get_timerId());
  m_timer_map.erase(pGif->get_timerId());
 }
}

LRESULT CTimeWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
 std::map<DWORD,CGifCtrl *>::const_iterator it = m_timer_map.find(wParam);
 if(it != m_timer_map.end())
 {
  ((*it).second)->UpdateFrame();
 }

 return 0 ;
}

2. gif主代码

gifCtrl.h
------------------------------
// GifCtrl.h : CGifCtrl 的声明
#pragma once
#include "resource.h"       // 主符号
#include <atlctl.h>
#include <gdiplus.h>
#include <comutil.h>
#include "TimerWnd.h"
using namespace Gdiplus;

// IGifCtrl
[
 object,
 uuid(3BAF90B3-AE30-4876-8379-00A06F9FA346),
 dual,
 helpstring("IGifCtrl 接口"),
 pointer_default(unique)
]
__interface IGifCtrl : public IDispatch
{
 [propget, id(1), helpstring("属性 Image")] HRESULT Image([out, retval] BSTR* pVal);
 [propput, id(1), helpstring("属性 Image")] HRESULT Image([in] BSTR newVal);
};


// CGifCtrl
[
 coclass,
 threading("apartment"),
 vi_progid("gif.GifCtrl"),
 progid("gif.GifCtrl.1"),
 version(1.0),
 uuid("EA036A36-3808-4528-9C97-AC2D579AE4A6"),
 helpstring("GifCtrl Class"),
 support_error_info(IGifCtrl),
 registration_script("control.rgs")
]
class ATL_NO_VTABLE CGifCtrl :
 public IGifCtrl,
 public IPersistStreamInitImpl<CGifCtrl>,
 public IOleControlImpl<CGifCtrl>,
 public IOleObjectImpl<CGifCtrl>,
 public IOleInPlaceActiveObjectImpl<CGifCtrl>,
 public IViewObjectExImpl<CGifCtrl>,
 public IOleInPlaceObjectWindowlessImpl<CGifCtrl>,
 public IPersistStorageImpl<CGifCtrl>,
 public ISpecifyPropertyPagesImpl<CGifCtrl>,
 public IQuickActivateImpl<CGifCtrl>,
 public IDataObjectImpl<CGifCtrl>,
 public IProvideClassInfo2Impl<&__uuidof(CGifCtrl), NULL>,
 public CComControl<CGifCtrl>
{

 Image *m_image ;
 _bstr_t m_imageFile ;
 int m_nFrameCount ;
 int m_nFramePosition;
 PropertyItem* m_pPropertyItem;

public:

 CGifCtrl():m_image(NULL),m_pPropertyItem(NULL),m_nFrameCount(0),m_nFramePosition(0),m_timerid(0xFFFFFFFF)
 {
 }

 ~CGifCtrl()
 {
 }

DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
 OLEMISC_CANTLINKINSIDE |
 OLEMISC_INSIDEOUT |
 OLEMISC_ACTIVATEWHENVISIBLE |
 OLEMISC_SETCLIENTSITEFIRST
)


BEGIN_PROP_MAP(CGifCtrl)
 PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
 PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
 // 示例项
 // PROP_ENTRY("Property Description", dispid, clsid)
 // PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()


BEGIN_MSG_MAP(CGifCtrl)
 CHAIN_MSG_MAP(CComControl<CGifCtrl>)
 DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// 处理程序原型:
//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

// IViewObjectEx
 DECLARE_VIEW_STATUS(0)

// IGifCtrl
public:

 HRESULT OnDraw(ATL_DRAWINFO& di)
 {
  RECT& rc = *(RECT*)di.prcBounds;
  // 将剪辑区域设置为 di.prcBounds 指定的矩形
  HRGN hRgnOld = NULL;
  if (GetClipRgn(di.hdcDraw, hRgnOld) != 1)
   hRgnOld = NULL;

  bool bSelectOldRgn = false;

  HRGN hRgnNew = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);

  if (hRgnNew != NULL)
  {
   bSelectOldRgn = (SelectClipRgn(di.hdcDraw, hRgnNew) != ERROR);
  }
  
  if(m_image)
  {
   Graphics graphics(di.hdcDraw); // Create a GDI+ graphics object
   graphics.DrawImage(m_image, di.prcBounds->left, di.prcBounds->top, m_image->GetWidth(), m_image->GetHeight()); 
  }
  
  if (bSelectOldRgn)
   SelectClipRgn(di.hdcDraw, hRgnOld);

  if(hRgnNew)
   DeleteObject(hRgnNew);

  return S_OK;
 }


 DECLARE_PROTECT_FINAL_CONSTRUCT()

 HRESULT FinalConstruct()
 {
  return S_OK;
 }

 STDMETHOD(GetExtent)(DWORD dwAspect , SIZEL *psizel)
 {
  if(m_image)
  {
   SIZEL szlPixels;
   szlPixels.cx = m_image->GetWidth();
   szlPixels.cy = m_image->GetHeight();
   AtlPixelToHiMetric(&szlPixels, psizel);
  }
  else
  {
   psizel->cx = 1000 ;
   psizel->cy = 1000;
  }

  return S_OK;
 }

 STDMETHOD(DoVerb)(LONG iVerb, LPMSG  pMsg , IOleClientSite* pActiveSite, LONG  lindex ,
  HWND hwndParent, LPCRECT lprcPosRect)
 {
  return S_OK;
 }

 STDMETHOD(Close)(DWORD dwSaveOption)
 {
  gTimerWnd.unregister_timer(this);
  return IOleObjectImpl<CGifCtrl>::Close(dwSaveOption);
 }

 void FinalRelease()
 {
 }

 STDMETHOD(get_Image)(BSTR* pVal);
 STDMETHOD(put_Image)(BSTR newVal);

 DWORD get_timerId()
 {
  return m_timerid ;
 }

 void set_timerId(DWORD id)
 {
  m_timerid = id ;
 }

 void UpdateFrame();

private:

 DWORD m_timerid ;

 
};

 ~CGdiPlus()
 {
  GdiplusShutdown(gdiplusToken);
 }
};

CGdiPlus gdiplus ;

在Word中实现动态GIF显示的ANIGIF控件 ANIGIF控件是一个特殊的ActiveX控件,它的主要功能是能够在支持ActiveX的应用程序中展示动态GIF文件。这种控件在早期的Web浏览器和桌面应用程序中相当常见,用于增强用户界面的互动性和视觉效果。由于GIF格式广泛支持动画,并且在早期的互联网上非常流行,ANIGIF控件因此成为了在Microsoft Office文档,尤其是Word和PowerPoint中展示动画内容的一个简单途径。 阅读详情

相关推荐

vb支持gif文件的全部方法.zip

vb支持gif文件的全部方法.zip

GDI+ for VC6 MFC

五年前,笔者曾在C#中使用GDI+开发程序,对其颇有好感。这一段时间,在使用VC6作图时,深切感会到使用GDI的种种不便,不比GDI+好用。沉迷于VC6的高效与轻便,不想只为了一个GDI+而被迫安装沉甸甸的.Net,便产生了一个疑问,难道GDI+只能用于.Net中吗?访问微软的MSDN网站后,随即解开了此谜。于是便有了此文 – 如何在VC6 MFC中使用GDI+。GDI+可应用于二维向量图

Sarkuya的编程园地 6457

Animation GIF ActiveX 2.0

Animation GIF ActiveX is a 32bit OLE Control Module to display GIF file(still and animation, GIF87a and GIF89a) in OLE Container. It supports all GIF89a standard, including transparent, animation, looping, delay time, logical screen, restoring to background, etc. It also supports Netscape GIF extension. Animation GIF ActiveX 2.0 has many new features including AutoSize, Stretch, custom playing sequence (reverse, pingpong or user-defined), etc. You can bind the GIF property in version 2.0 to database in your application. Version 2.0 has no flickering when displaying large GIF files in transparent or opaque mode. Version 2.0 can recover the correct frames in the damaged GIF file. Version 2.0 is made in ATL, so you don't need any additional DLL when using the ActiveX. Animation GIF ActiveX supports most popular development platforms including VB, VC++, VFP, VBA, Access, Delphi, etc. Animation GIF ActiveX is shareware. If you are using an unregistered version, please see Registration to get information about how to register. Important notes for 1.x users: Because 2.0 is made in ATL, it's very different from version 1.x. The properties, methods, calling interfaces and CLSIDs are changed. So the applications using 1.x should be redesigned for Animation GIF ActiveX 2.0. If you have any questions, please send E-mail to jinhui@jcomsoft.com Please visit my home page http://www.jcomsoft.com to get the newest version, news and more great and FREE ActiveX. Now you can register your copy online via world wide web.

用VS2008+ATL开发Gif的ActiveX控件的步骤

keywords:ATL,ActiveX,gif,多线程用VS2008+ATL开发显示Gif的ActiveX控件base:MSDN:开发语言-VS文档-VC++-参考信息-库参考-ATL-Concepts-ATL Tutorial1   创建解决方案创建一个空的解决方案,名称GifSolution。将来包含控件项目和测试项目。2   创建ATL项目解决方案视图-右击解决方案

crybird的C/C++ 1万+

图像显示ActiveX控件

支持显示JPG,BMP,GIF文件的显示

Angel Gif ActiveX控件

<br> Angel Gif ActiveX控件 是一个在OLE Container或浮动在屏幕显示GIF文件的AxtiveX控件。它支持所有GIF89a标准,包括透明,动画,圆圈,延时等。它有很多特色,例如自动大小,伸展, 标题,中心显示风格,popup菜单,隐藏,屏幕浮动和随机移动等。<br><br> Angel Gif ActiveX控件 支持最流行的开发平台包括VB、VC++、VFP、 VBA、Access、Delphi等。支持Windows 2000 和Windows XP。<BR><BR>

自定义控件 播放GIF动画

代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; /

Jia_ShengJie 2323

VB Animation GIF ActiveX控件

VB Animation GIF ActiveX控件 YQSoft公司开发的一款功能强大的OCX控件,让你在Visual Basic程序中实现GIF动画,程序很小但功能强大而且是纯VB代码开发,没有使用任何其他的控件,控件仅40K,安装包只有12K,不妨一试。 VB Animation GIF ActiveX控件主要特色: 支持多数GIF89a标准,包括动画,延迟时间等 分析GIF的每一帧 自动调整大小,自动缩放 支持JPEG, BMP和任何支持VB的其他图片格式 纯VB代码开发,没有使用任何其他的控件 文件小,控件仅40K,安装包只有12K 支持VB6和VB5

向Richedit插入动态Gif的实现

要做一个类似QQ表情的东西,用BCB6.0来做,本来这个工具也不是熟悉,用得多还是VC吧,难! 上网查了一下,因为要播放GIF文件,那个在优快云说的几乎都是说用QQ的ImageOle来做,然后就是一大堆的链接,说哪里哪里有的,怎样引用法 但是版权啊 而且全都是05年的帖子,奇怪了,难道是百度的错,还是现在没有人做这个了 无耐,继续百度 google, 找到了一位哥们做的 类似 MSN

让软件普及到企业中去而奋斗终生 2452

Ansys -PEmag 平面变压器仿真与circuit电路模型验证

ansys 软件集成了电路、磁路、PCB参数提取,结构参数提取等功能仿真,基于内置模块的功能参数的仿真后可以提取出主要关键参数,寄生参数,频域响应参数等。该软件的优势在于能够将所有的仿真参数导出为电路模型文件,可以在自带的模块中仿真也可以导出在其他第三方软件中仿真,比如matlab-simulink文件扥。主要介绍ANSYS插件的使用,对PEmag做了详细使用说明并通过案例得到对用的变压器参数;基于变压器参数再将其磁路模型导入到电路中进行建模仿真,实现PEmag与circuit的联合仿真。

weixin_41609745的博客 3016

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 471

用VS ATL工程开发播放Gif图片控件的步骤

1 创建解决方案 创建一个空的解决方案,名称GifSolution。将来包含控件项目和测试项目。 2 创建ATL项目 解决方案视图-右击解决方案-添加-新建项目,弹出的对话框中选ATL项目,名称为GifAnimate确定。弹出的对话框中选择DLL服务器(可选允许合并代理存根,这样不会产生代理dll),完成后编译,这样工程框架就完成了。 3 添加新组件 3.1 一点要说明的

dvlinker的技术专栏 2350

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

向Richedit插入动态Gif的实现(关于QQ表情功能的制作)

http://www.cnblogs.com/tony-law/archive/2011/09/16/2178944.html 要做一个类似QQ表情的东西,用BCB6.0来做,本来这个工具也不是熟悉,用得多还是VC吧,难! 上网查了一下,因为要播放GIF文件,那个在优快云说的几乎都是说用QQ的ImageOle来做,然后就是一大堆的链接,说哪里哪里有的,怎样引用法 但是版权啊

xiao190128的专栏 1285

解码器选型参数,结构原理,工艺与注意问题总结

解码器芯片(Decoder Chip)是电子设备中的一个重要组件,通常用于处理、解释和输出存储在某种编码格式中的数据或信号。本文对解码器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1170

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 262

FlowChartX 4.9.9 ActiveX Crack

FlowChartX 使我们能够为我们的产品提供全面的图形图表工具,从而显着增强可视化功能,并使我们的软件更易于使用。Mindfusion 的支持非常出色,他们的产品可靠且运行良好

控件与插件之大全 423

使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台

这家虚构的金融科技 SaaS 组织在 Microsoft Azure 上构建了一个现代化的多区域架构,以实现高可用性、主动安全性和简化的 DevSecOps 工作流。如果您是 DevOps 从业者、SRE 专业人士或致力于创建弹性、可扩展且安全的金融科技解决方案的技术领导者,您将从中获得可直接应用于您自身项目的见解和经验教训。与大多数快速扩张的金融科技公司一样,他们需要确保不间断的正常运行时间、坚不可摧的安全性以及快速的功能交付,以满足全球用户群的需求。即使是短暂的中断也会损害用户的信心和忠诚度。

介绍AWS Azure GCP devops Terraform 等技术 1298

无窗口插件1

MFC控件的不创建窗口也允许激活的选项查探 http://blog.youkuaiyun.com/jszj/article/details/39890597 ATL ActiveX控件的OnCreate函数不能执行: http://bbs.youkuaiyun.com/topics/200016476 在ATL无窗口ACTIVEX控件中响应timer消息   http://blog.youkuaiyun.com/gxul...

weixin_34117211的博客 148

【CANdelaStudio编辑CDD】-1.2-给$10服务SessionControl创建一个新Session会话并修改Session state machine会话状态机(UDS诊断)

前一篇:【UDS诊断描述文件CDD】-1.1-ISO_14229中$10服务理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/120375515案例背景: 在CDD中如何给$10服务创建一个新的Session会话; 在CDD中如何给$10服务修改Session state machine会话状态机。 目录 1 查看$10服务中已有的Session会话​ 2 查看$10服务中已有的Session state machine会话状态机 3 在$10...

「汽车电子助手」的博客 6075

产品缺陷检测:表面缺陷检测_(1).产品缺陷检测基础理论

确定像素之间的相似性准则,如灰度值的差异。

zhubeibei168的博客 832

ATL中使用GDI+,png

问题:一个png图片用CImage打开是黑色背景的,但用windows图片查看器打开和打印都是透明的,于是想使用gdi+  1建一个ATL工程:2在第二步的时候,选择支持MFC,以为GDI+对象需要DC对象,这个是GDI的东西,如下图3 为组件添加一个接口Manager你需要在Stdafx.h文件中加入下面两行: #include using namespace Gdiplus; #pragma

dragoo1的专栏 898

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用定时器显示GIF动画的ATL控件实现

最近在做一个IM软件,IM软件非常重要的功能就有动态表情的插入和显示。实现GIF图片显示的方法主要有两种,一种是通过HTML控件,一种是通过RichEdit控件。HTML控件显示GIF动画的效率是很高的,但是可操控性不好(比如不允许表情修改尺寸,插入后自动滚动到聊天记录窗口的底部等);RichEdit的可操控性就好得多了,但是插入和显示GIF动画就比较麻烦。 网上流传的向CRichEditCtr

haoekin的专栏 4116

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 基于STL的字符串最大长度匹配算法
下一篇: Build ACE 5.4.1 with new Proactor
larrin
博客等级 码龄23年 2粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值