PictureEx.h
上传用户:xiuanze55
上传日期:2013-06-16
资源大小:85k
文件大小:7k
源码类别:

其他数据库

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // PictureEx.cpp: implementation of the CPicture class.
  3. //
  4. // Picture displaying control with support for the following formats:
  5. // GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR
  6. // 
  7. // Written by Oleg Bykov (oleg_bykoff@rsdn.ru)
  8. // Copyright (c) 2001
  9. //
  10. // Modified by jingzhou Xu
  11. //////////////////////////////////////////////////////////////////////
  12. #if !defined(AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_)
  13. #define AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_
  14. #if _MSC_VER > 1000
  15. #pragma once
  16. #endif // _MSC_VER > 1000
  17. #include <vector>
  18. //#define GIF_TRACING  // uncomment it if you want detailed TRACEs
  19. class CPictureEx : public CStatic
  20. {
  21. public:
  22. struct TFrame    // structure that keeps a single frame info
  23. {
  24. IPicture *m_pPicture;  // pointer to the interface used for drawing
  25. SIZE     m_frameSize;
  26. SIZE     m_frameOffset;
  27. UINT     m_nDelay;     // delay (in 1/100s of a second)
  28. UINT     m_nDisposal;  // disposal method
  29. };
  30. #pragma pack(1)   // turn byte alignment on
  31. enum GIFBlockTypes
  32. {
  33. BLOCK_UNKNOWN,
  34. BLOCK_APPEXT,
  35. BLOCK_COMMEXT,
  36. BLOCK_CONTROLEXT,
  37. BLOCK_PLAINTEXT,
  38. BLOCK_IMAGE,
  39. BLOCK_TRAILER
  40. };
  41. enum ControlExtValues // graphic control extension packed field values
  42. {
  43. GCX_PACKED_DISPOSAL,  // disposal method
  44. GCX_PACKED_USERINPUT,
  45. GCX_PACKED_TRANSPCOLOR
  46. };
  47. enum LSDPackedValues  // logical screen descriptor packed field values
  48. {
  49. LSD_PACKED_GLOBALCT,
  50. LSD_PACKED_CRESOLUTION,
  51. LSD_PACKED_SORT,
  52. LSD_PACKED_GLOBALCTSIZE
  53. };
  54. enum IDPackedValues   // image descriptor packed field values
  55. {
  56. ID_PACKED_LOCALCT,
  57. ID_PACKED_INTERLACE,
  58. ID_PACKED_SORT,
  59. ID_PACKED_LOCALCTSIZE
  60. };
  61. struct TGIFHeader       // GIF header  
  62. {
  63. char m_cSignature[3]; // Signature - Identifies the GIF Data Stream
  64.   // This field contains the fixed value 'GIF'
  65. char m_cVersion[3]; // Version number. May be one of the following:
  66. // "87a" or "89a"
  67. };
  68. struct TGIFLSDescriptor // Logical Screen Descriptor
  69. {
  70. WORD m_wWidth; // 2 bytes. Logical screen width
  71. WORD m_wHeight; // 2 bytes. Logical screen height
  72. unsigned char m_cPacked;      // packed field
  73. unsigned char m_cBkIndex;     // 1 byte. Background color index
  74. unsigned char m_cPixelAspect; // 1 byte. Pixel aspect ratio
  75. inline int GetPackedValue(enum LSDPackedValues Value);
  76. };
  77. struct TGIFAppExtension // application extension block
  78. {
  79. unsigned char m_cExtIntroducer; // extension introducer (0x21)
  80. unsigned char m_cExtLabel; // app. extension label (0xFF)
  81. unsigned char m_cBlockSize; // fixed value of 11
  82. char m_cAppIdentifier[8];   // application identifier
  83. char m_cAppAuth[3];  // application authentication code
  84. };
  85. struct TGIFControlExt // graphic control extension block
  86. {
  87. unsigned char m_cExtIntroducer; // extension introducer (0x21)
  88. unsigned char m_cControlLabel;  // control extension label (0xF9)
  89. unsigned char m_cBlockSize; // fixed value of 4
  90. unsigned char m_cPacked;    // packed field
  91. WORD m_wDelayTime; // delay time
  92. unsigned char m_cTColorIndex; // transparent color index
  93. unsigned char m_cBlockTerm;   // block terminator (0x00)
  94. public:
  95. inline int GetPackedValue(enum ControlExtValues Value);
  96. };
  97. struct TGIFCommentExt  // comment extension block
  98. {
  99. unsigned char m_cExtIntroducer; // extension introducer (0x21)
  100. unsigned char m_cCommentLabel;  // comment extension label (0xFE)
  101. };
  102. struct TGIFPlainTextExt // plain text extension block
  103. {
  104. unsigned char m_cExtIntroducer;  // extension introducer (0x21)
  105. unsigned char m_cPlainTextLabel; // text extension label (0x01)
  106. unsigned char m_cBlockSize; // fixed value of 12
  107. WORD m_wLeftPos;    // text grid left position
  108. WORD m_wTopPos;     // text grid top position
  109. WORD m_wGridWidth;  // text grid width
  110. WORD m_wGridHeight; // text grid height
  111. unsigned char m_cCellWidth;  // character cell width
  112. unsigned char m_cCellHeight; // character cell height
  113. unsigned char m_cFgColor; // text foreground color index
  114. unsigned char m_cBkColor; // text background color index
  115. };
  116. struct TGIFImageDescriptor // image descriptor block
  117. {
  118. unsigned char m_cImageSeparator; // image separator byte (0x2C)
  119. WORD m_wLeftPos; // image left position
  120. WORD m_wTopPos;  // image top position
  121. WORD m_wWidth;   // image width
  122. WORD m_wHeight;  // image height
  123. unsigned char m_cPacked; // packed field
  124. inline int GetPackedValue(enum IDPackedValues Value);
  125. };
  126. #pragma pack() // turn byte alignment off
  127. public:
  128. CPictureEx();
  129. virtual ~CPictureEx();
  130. void Stop();   // stops animation
  131. void UnLoad(); // stops animation plus releases all resources
  132. BOOL IsGIF() const;
  133. BOOL IsAnimatedGIF() const;
  134. SIZE GetSize() const;
  135. int GetFrameCount() const;
  136. COLORREF GetBkColor() const;
  137. void SetBkColor(COLORREF clr);
  138. // draws the picture (starts an animation thread if needed)
  139. BOOL Draw();
  140. // loads a picture from a file
  141. // i.e. Load(_T("mypic.gif"));
  142. BOOL Load(LPCTSTR szFileName);
  143. // loads a picture from a global memory block (allocated by GlobalAlloc)
  144. // Warning: this function DOES NOT free the global memory, pointed to by hGlobal
  145. BOOL Load(HGLOBAL hGlobal, DWORD dwSize);
  146. // loads a picture from a program resource
  147. // i.e. Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));
  148. BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);
  149. protected:
  150. #ifdef GIF_TRACING
  151. void EnumGIFBlocks();
  152. void WriteDataOnDisk(CString szFileName, HGLOBAL hData, DWORD dwSize);
  153. #endif // GIF_TRACING
  154. SIZE m_PictureSize;
  155. COLORREF m_clrBackground;
  156. UINT m_nDataSize;
  157. UINT m_nCurrOffset;
  158. UINT m_nGlobalCTSize;
  159. BOOL m_bIsGIF;
  160. BOOL m_bExitThread;
  161. BOOL m_bIsInitialized;
  162. HDC m_hMemDC;
  163. HBITMAP m_hBitmap;
  164. HBITMAP m_hOldBitmap;
  165. HANDLE m_hThread;
  166. HANDLE m_hExitEvent;
  167. IPicture * m_pPicture;
  168. TGIFHeader * m_pGIFHeader;
  169. unsigned char * m_pRawData;
  170. TGIFLSDescriptor * m_pGIFLSDescriptor;
  171. std::vector<TFrame> m_arrFrames;
  172. void ThreadAnimation();
  173. static UINT WINAPI _ThreadAnimation(LPVOID pParam);
  174. int GetNextBlockLen() const;
  175. BOOL SkipNextBlock();
  176. BOOL SkipNextGraphicBlock();
  177. BOOL PrepareDC(int nWidth, int nHeight);
  178. void ResetDataPointer();
  179. enum GIFBlockTypes GetNextBlock() const;
  180. UINT GetSubBlocksLen(UINT nStartingOffset) const;
  181. HGLOBAL GetNextGraphicBlock(UINT *pBlockLen, UINT *pDelay, 
  182. SIZE *pBlockSize, SIZE *pBlockOffset, UINT *pDisposal);
  183. // Generated message map functions
  184. //{{AFX_MSG(CMyStatic)
  185. afx_msg void OnDestroy();
  186. afx_msg void OnPaint();
  187. //}}AFX_MSG
  188. DECLARE_MESSAGE_MAP()
  189. };
  190. #endif // !defined(AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_)