⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageshow.h

📁 类似QQ,MSN表情的richedit调用控件,实现gif的显示.
💻 H
字号:
// ImageShow.h : CImageShow 的声明
#pragma once
#include "resource.h"       // 主符号
#include <atlctl.h>
#include "ImageOle.h"
#include "WinHidden.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

#define DISPOSAL_NO 0
#define DISPOSAL_NOT 4
#define DISPOSAL_RESTBACK 8
#define DISPOSAL_RESTORE 12
#define ID_TIMER         609

typedef struct
{
	BYTE bit;
	WORD previouscode;
	WORD nextcode;
} GIFTABLE;

// CImageShow
class ATL_NO_VTABLE CImageShow :
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispatchImpl<IImageShow, &IID_IImageShow, &LIBID_ImageOleLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
	public IPersistStreamInitImpl<CImageShow>,
	public IOleControlImpl<CImageShow>,
	public IOleObjectImpl<CImageShow>,
	public IOleInPlaceActiveObjectImpl<CImageShow>,
	public IViewObjectExImpl<CImageShow>,
	public IOleInPlaceObjectWindowlessImpl<CImageShow>,
	public ISupportErrorInfo,
	public IPersistStorageImpl<CImageShow>,
	public ISpecifyPropertyPagesImpl<CImageShow>,
	public IQuickActivateImpl<CImageShow>,
#ifndef _WIN32_WCE
	public IDataObjectImpl<CImageShow>,
#endif
	public IProvideClassInfo2Impl<&CLSID_ImageShow, NULL, &LIBID_ImageOleLib>,
#ifdef _WIN32_WCE // 要在 Windows CE 上正确加载该控件,要求 IObjectSafety
	public IObjectSafetyImpl<CImageShow, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#endif
	public CComCoClass<CImageShow, &CLSID_ImageShow>,
	public CComControl<CImageShow>
{

protected:
	BOOL	m_bAutoStart;
	BOOL	m_bEmbed;
	BOOL	m_bGlass;
	TCHAR	filename[_MAX_PATH];
	BYTE*	m_pcGlobalColorTable;
	BYTE*	m_pcGif;
	HBITMAP m_hRedrawBitmap;
	int		m_iTotalReadByte;
	int		m_iGifSize;
	int     m_iGlobalColorSize;
	int		m_iBackgroundColor;
	int		m_iGifWidth;
	int		m_iGifHeight;
	BYTE*	m_pcGifTrack; 
	int		m_iTransparentIndex;
	int		m_iDelayTime;
	BOOL	m_bTransparentIndex;
	int		m_iDisposalMethod;
	int		m_x;
	int     m_y;
	int		m_iPass;
	int     m_iRow;
	UINT	m_uRemain;
	UINT	m_uReadByte;
	UINT	m_uBlockSize;
	BYTE	m_cCurentByte;
	BYTE	m_cPackedField;
	int		m_iWidth;
	int		m_iHeight;
	int		m_iTop;
	int		m_iLeft;
	int		m_iMaxByte;
	BYTE*	m_pcBitmap;
	UINT	m_uBitSize;
	UINT	m_uPrimaryBitSize;
	COLORREF m_TransparentColor;
	int		m_iWidth1;
	HDC		m_hDC;
	int		flag;
	BOOL    m_bAutoSize1;
	DWORD	m_dwSpeed;
	BOOL	m_bRunMode;
	volatile int  m_EndRun;
	volatile BOOL m_bLockBitmap;
	CCWinHidden m_HideWnd;
public:
	CImageShow()
	{
		m_bAutoStart	= TRUE;
		m_bEmbed		= FALSE;
		m_bGlass        = FALSE;
		lstrcpy(filename,_T(""));
		m_pcGlobalColorTable = 0;
		m_pcGif			= 0;
		m_hRedrawBitmap = 0;
		m_iTotalReadByte     = 0;
		m_iGifSize		= 0;
		m_iGlobalColorSize	 = 0;
		m_iDelayTime    = 0;
		m_bTransparentIndex = FALSE;
		flag			= 0;
		m_bAutoSize1	= TRUE;
		m_EndRun		= 0;
		m_dwSpeed		= 50;
		m_bRunMode		= 1;
		m_hDC           = 0;
		m_bLockBitmap   = FALSE;

		m_bWindowOnly   = TRUE;
		m_bNegotiatedWnd= TRUE;
		m_bWndLess      = FALSE;
		m_bResizeNatural= TRUE;
		m_bRecomposeOnResize = TRUE;
	}

	~CImageShow()
	{
		Stop();

		if( m_hRedrawBitmap != 0 )
			DeleteObject(m_hRedrawBitmap);

		if( m_pcGlobalColorTable != NULL )
			delete[] m_pcGlobalColorTable;

		if( m_pcGif != NULL )
			delete[] m_pcGif;
	}

	BOOL Load(LPCTSTR filename);
	HBITMAP FirstImage(void);
	HBITMAP NextImage(void);
	HBITMAP TakeIt(void);
	WORD GetCode(void);
	BYTE GetByte(void);
	void Output(BYTE bit);
	BOOL Play2(void);

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

DECLARE_REGISTRY_RESOURCEID(IDR_IMAGESHOW)


BEGIN_COM_MAP(CImageShow)
	COM_INTERFACE_ENTRY(IImageShow)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IViewObjectEx)
	COM_INTERFACE_ENTRY(IViewObject2)
	COM_INTERFACE_ENTRY(IViewObject)
	COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceObject)
	COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
	COM_INTERFACE_ENTRY(IOleControl)
	COM_INTERFACE_ENTRY(IOleObject)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
	COM_INTERFACE_ENTRY(IQuickActivate)
	COM_INTERFACE_ENTRY(IPersistStorage)
#ifndef _WIN32_WCE
	COM_INTERFACE_ENTRY(IDataObject)
#endif
	COM_INTERFACE_ENTRY(IProvideClassInfo)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
#ifdef _WIN32_WCE // 要在 Windows CE 上正确加载该控件,要求 IObjectSafety
	COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
#endif
END_COM_MAP()

BEGIN_PROP_MAP(CImageShow)
	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(CImageShow)
	CHAIN_MSG_MAP(CComControl<CImageShow>)
	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);

// ISupportsErrorInfo
	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
	{
		static const IID* arr[] =
		{
			&IID_IImageShow,
		};

		for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
		{
			if (InlineIsEqualGUID(*arr[i], riid))
				return S_OK;
		}
		return S_FALSE;
	}

// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IImageShow
public:
	HRESULT OnDraw(ATL_DRAWINFO& di);
		
	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}
	STDMETHOD(get_Embed)(VARIANT_BOOL* pVal);
	STDMETHOD(put_Embed)(VARIANT_BOOL newVal);
	STDMETHOD(get_FileName)(BSTR* pVal);
	STDMETHOD(put_FileName)(BSTR newVal);
	STDMETHOD(get_AutoStart)(VARIANT_BOOL* pVal);
	STDMETHOD(put_AutoStart)(VARIANT_BOOL newVal);
	STDMETHOD(Stop)(void);
	STDMETHOD(Play)(void);
	STDMETHOD(get_Glass)(VARIANT_BOOL* pVal);
	STDMETHOD(put_Glass)(VARIANT_BOOL newVal);
	STDMETHOD(AboutBox)();
};

OBJECT_ENTRY_AUTO(__uuidof(ImageShow), CImageShow)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -