📄 imageshow.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 + -