#ifndef GIF_IMAGE_HEAD_FILE #define GIF_IMAGE_HEAD_FILE #pragma once #include "SkinUI.h" ////////////////////////////////////////////////////////////////////////// //GIF 枚举定义 //类型枚举 enum enGIFBlockTypes { BLOCK_UNKNOWN, //未知类型 BLOCK_APPEXT, //图形控制 BLOCK_COMMEXT, //注释标签 BLOCK_CONTROLEXT, //图形标签 BLOCK_PLAINTEXT, //图形标签 BLOCK_IMAGE, //图象标识 BLOCK_TRAILER //文件终结 }; //扩展枚举 enum enControlExtValues { GCX_PACKED_DISPOSAL, //处置方法 GCX_PACKED_USERINPUT, //输入标志 GCX_PACKED_TRANSPCOLOR //透明标志 }; //显示描述 enum enLSDPackedValues { LSD_PACKED_GLOBALCT, //颜色标志 LSD_PACKED_CRESOLUTION, //颜色深度 LSD_PACKED_SORT, //分类标志 LSD_PACKED_GLOBALCTSIZE //全局颜色 }; //描述枚举 enum enIDPackedValues { ID_PACKED_LOCALCT, //颜色标志 ID_PACKED_INTERLACE, //交织标志 ID_PACKED_SORT, //分类标志 ID_PACKED_LOCALCTSIZE //颜色大小 }; ////////////////////////////////////////////////////////////////////////// //GIF 结构定义 #pragma pack(1) //文件头结构 struct tagGIFHeader { BYTE cbSignature[3]; //GIF 署名 BYTE cbVersion[3]; //GIF 版本 }; //逻辑屏幕标识符 struct tagGIFLSDescriptor { WORD wWidth; //屏幕宽度 WORD wHeight; //屏幕高度 BYTE cbPacked; //颜色标志 BYTE cbBkIndex; //背景颜色 BYTE cbPixelAspect; //像素宽高比 }; //图象标识符 struct tagGIFImageDescriptor { BYTE cbImageSeparator; //图象标识符 WORD wXExcursion; //X 偏移量 WORD wYExcursion; //Y 偏移量 WORD wWidth; //图象宽度 WORD wHeight; //图象高度 BYTE cbPacked; //颜色标志 }; //图形控制扩展 struct tagGIFControlExt { BYTE cbExtIntroducer; //标识标志 BYTE cbControlLabel; //标识标志 BYTE cbBlockSize; //区块大小 BYTE cbPacked; //处置方法 WORD wDelayTime; //延迟时间 BYTE cbTColorIndex; //透明色索引 BYTE cbBlockTerm; //块终结器 }; //注释扩展 struct tagGIFCommentExt { BYTE cbExtIntroducer; //扩展标识 BYTE cbCommentLabel; //注释标签 }; //图形文本扩展 struct tagGIFPlainTextExt { BYTE cbExtIntroducer; //扩展标识 BYTE cbPlainTextLabel; //图形标签 BYTE cbBlockSize; //区块大小 WORD wLeftPos; //边界位置 WORD wTopPos; //边界位置 WORD wGridWidth; //文本框宽 WORD wGridHeight; //文本框高 BYTE cbCellWidth; //单元宽度 BYTE cbCellHeight; //单元高度 BYTE cbForeGroundColor; //颜色索引 BYTE cbBackGroundColor; //颜色索引 }; //应用程序扩展 struct tagGIFAppExtension { BYTE cExtIntroducer; //扩展标识 BYTE cExtLabel; //图形标签 BYTE cBlockSize; //区块大小 char cAppIdentifier[8]; //程序标识 char cAppAuth[3]; //程序鉴别 }; #pragma pack() ////////////////////////////////////////////////////////////////////////// //结构定义 //显示结构 struct tagGIFFrameInfo { UINT nDelay; //显示延时 UINT nDisposal; //处理方式 WORD wXExcursion; //图像偏移 WORD wYExcursion; //图像偏移 WORD wImageWidth; //图像宽度 WORD wImageHeight; //图像高度 IPicture * pIFramePicture; //图像接口 }; //数据信息 struct tagImageDataInfo { LONG lDataSize; //数据大小 LONG lCurentPos; //当前指针 LONG lColorTableSize; //颜色大小 LPBYTE cbImageDataBuffer; //图形数据 }; //数组定义 typedef CArray CGIFFrameInfoArray; ////////////////////////////////////////////////////////////////////////// //动画对象 class SKINUI_CLASS CGIFImage { //属性变量 protected: WORD m_wImageWidth; //屏幕宽度 WORD m_wImageHeight; //屏幕高度 COLORREF m_crBackGroundColor; //背景颜色 //内核变量 protected: INT_PTR m_nCurrentFrame; //当前图帧 CGIFFrameInfoArray m_GIFFrameInfoArray; //片断数组 //函数定义 public: //构造函数 CGIFImage(); //析构函数 virtual ~CGIFImage(); //加载函数 public: //加载动画 bool LoadFromFile(LPCTSTR pszFileName); //加载动画 bool LoadFromMemroy(BYTE * pcbData, LONG lDataSize); //加载动画 bool LoadFromResource(LPCTSTR pszResourceName, LPCTSTR pszResourceType); //控制函数 public: //是否加载 bool IsNull(); //释放图像 VOID DestroyImage(); //信息函数 public: //图像宽度 WORD GetWidth() { return m_wImageWidth; } //图像高度 WORD GetHeight() { return m_wImageHeight; } //当前图帧 INT_PTR GetCurrentIndex() { return m_nCurrentFrame; } //图帧函数 public: //当前图帧 tagGIFFrameInfo * GetCurrentFrame(); //图像数目 INT_PTR GetFrameCount() { return m_GIFFrameInfoArray.GetCount(); } //绘画函数 public: //绘画图像 VOID DrawImageFrame(CDC * pDC, INT nXPos, INT nYPos); //绘画图像 VOID DrawImageFrame(CDC * pDC, INT nXPos, INT nYPos, INT_PTR nFrameIndex); //区块函数 protected: //切换区块 bool SwitchNextBlock(tagImageDataInfo & ImageDataInfo); //区块长度 LONG GetCurrentBlockSize(tagImageDataInfo & ImageDataInfo); //区块长度 LONG GetSubBlockSize(tagImageDataInfo & ImageDataInfo, LONG lBlockPos); //获取类型 enGIFBlockTypes GetCurrentBlockType(tagImageDataInfo & ImageDataInfo); //内部函数 private: //获取数值 inline INT GetPackedValue(const tagGIFControlExt * pGIFControlExt, enum enControlExtValues Value); //获取数值 inline INT GetPackedValue(const tagGIFLSDescriptor * pGIFLSDescriptor, enum enLSDPackedValues Value); //获取数值 inline INT GetPackedValue(const tagGIFImageDescriptor * pGIFControlExt, enum enIDPackedValues Value); }; ////////////////////////////////////////////////////////////////////////// #endif