<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[千寻网络官方BLOG]]></title>
  <subtitle type="html"><![CDATA[遠方 有一個地方，那裏曾有我們的夢想……]]></subtitle>
  <id>http://www.89zz.com/</id>
  <link rel="alternate" type="text/html" href="http://www.89zz.com/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.89zz.com/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-11-06T16:13:37+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[VC 获得系统当前日期]]></title>
	  <author>
		 <name>凌晨</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=55" label="凌晨杂货" /> 
	  <updated>2008-11-06T16:13:37+08:00</updated>
	  <published>2008-11-06T16:13:37+08:00</published>
		  <summary type="html"><![CDATA[CTime&nbsp;&nbsp; t=CTime::GetCurrentTime();&nbsp;&nbsp; <br/>&nbsp;&nbsp;CString&nbsp;&nbsp; time=t.Format(&#34;%Y-%m-%d-%H:%M:%S&#34;);]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/317.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=317</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[vc 界面设设计器尺寸与实际尺寸的关系]]></title>
	  <author>
		 <name>凌晨</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=55" label="凌晨杂货" /> 
	  <updated>2008-10-26T04:58:56+08:00</updated>
	  <published>2008-10-26T04:58:56+08:00</published>
		  <summary type="html"><![CDATA[在VC 界面设计的时候 右下角显示的和在屏幕上的并不相等 公式如下：<br/><br/>WidthReal&nbsp;&nbsp; = (WidthMarked + 3) * 2<br/><br/>HeightReal = HeightMarked * 2 + 30<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/316.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=316</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[vc PictureEx 类 显示图片 ]]></title>
	  <author>
		 <name>凌晨</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=55" label="凌晨杂货" /> 
	  <updated>2008-10-26T04:54:07+08:00</updated>
	  <published>2008-10-26T04:54:07+08:00</published>
		  <summary type="html"><![CDATA[<p><span style="font-size: 12px"><span style="font-family: 宋体">以DLG 为例</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">1、在XXDLG.CPP中 加入 #include &quot;PictureEx.h&quot;</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">2、在对话框 加入Picture Control控件 ID 为IDC_IMG ；type 为Rectangle</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 为Picture Control添加变量 m_img&nbsp; 类型为CPictureEx</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">3、onInitDialog()中</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_Img.Load(_T(&quot;bg.jpg&quot;)))//这个方法是本地读取，其他方法查找PictureEx.h&nbsp;方法列在下面<br />
&nbsp;&nbsp;&nbsp;&nbsp; m_Img.Draw();</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // loads a picture from a file<br />
&nbsp;// i.e. Load(_T(&quot;mypic.gif&quot;));<br />
&nbsp;BOOL Load(LPCTSTR szFileName);</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;// loads a picture from a global memory block (allocated by GlobalAlloc)<br />
&nbsp;// Warning: this function DOES NOT free the global memory, pointed to by hGlobal<br />
&nbsp;BOOL Load(HGLOBAL hGlobal, DWORD dwSize);</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;// loads a picture from a program resource<br />
&nbsp;// i.e. Load(MAKEINTRESOURCE(IDR_MYPIC),_T(&quot;GIFTYPE&quot;));<br />
&nbsp;BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">效果图：</span></span></p>
<p><span style="font-size: 12px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.89zz.com/attachments/month_0810/02008102645338.jpg" /></span></span></p>
<p><a href="http://www.89zz.com/attachments/month_0810/f2008102645326.rar"><span style="font-size: 12px"><span style="font-family: 宋体"><img alt="" border="0" style="margin: 0px 2px -4px 0px" src="http://www.89zz.com/../../images/download.gif" />点击下载此文件</span></span></a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/315.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=315</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[VC++ GIF,JPEG, BMP, WMF, ICO, CUR 图片显示]]></title>
	  <author>
		 <name>凌晨</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=55" label="凌晨杂货" /> 
	  <updated>2008-10-26T04:27:02+08:00</updated>
	  <published>2008-10-26T04:27:02+08:00</published>
		  <summary type="html"><![CDATA[<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">//////////////////////////////////////////////////////////////////////</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">///////////////////PictureEx.h//////////////////////<br />
// PictureEx.cpp: implementation of the CPictureEx class.<br />
//<br />
// Picture displaying control with support for the following formats:<br />
// GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR<br />
// <br />
// Written by Oleg Bykov (</span></span></span><span style="font-size: 12px"><span style="font-family: 宋体"><a href="http://www.89zz.com/mailto:oleg_bykoff@rsdn.ru"><span style="font-size: 14px">oleg_bykoff@rsdn.ru</span></a><span style="font-size: 14px">)<br />
// Copyright (c) 2001<br />
//<br />
// To use CPictureEx, follow these steps:<br />
//&nbsp;&nbsp; - place a static control on your dialog (either a text or a bitmap)<br />
//&nbsp;&nbsp; - change its identifier to something else (e.g. IDC_MYPIC)<br />
//&nbsp;&nbsp; - associate a CStatic with it using ClassWizard<br />
//&nbsp;&nbsp; - in your dialog's header file replace CStatic with CPictureEx<br />
//&nbsp;&nbsp;&nbsp;&nbsp; (don't forget to #include &quot;PictureEx.h&quot; and add <br />
//&nbsp;&nbsp;&nbsp;&nbsp; PictureEx.h and PictureEx.cpp to your project)<br />
//&nbsp;&nbsp; - call one of the overloaded CPictureEx::Load() functions somewhere<br />
//&nbsp;&nbsp;&nbsp;&nbsp; (OnInitDialog is a good place to start)<br />
//&nbsp;&nbsp; - if the preceding Load() succeeded call Draw()<br />
//&nbsp; <br />
// You can also add the control by defining a member variable of type <br />
// CPictureEx, calling CPictureEx::Create (derived from CStatic), then <br />
// CPictureEx::Load and CPictureEx::Draw.<br />
//<br />
// By default, the control initializes its background to COLOR_3DFACE<br />
// (see CPictureEx::PrepareDC()). You can change the background by<br />
// calling CPictureEx::SetBkColor(COLORREF) after CPictureEx::Load().<br />
//<br />
// I decided to leave in the class the functions to write separate frames from <br />
// animated GIF to disk. If you want to use them, uncomment #define GIF_TRACING <br />
// and an appropriate section in CPictureEx::Load(HGLOBAL, DWORD). These functions <br />
// won't be compiled and linked to your project unless you uncomment #define GIF_TRACING,<br />
// so you don't have to worry.<br />
// <br />
// Warning: this code hasn't been subject to a heavy testing, so<br />
// use it on your own risk. The author accepts no liability for the <br />
// possible damage caused by this code.<br />
//<br />
// Version 1.0&nbsp; 7 Aug 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Initial release<br />
//<br />
// Version 1.1&nbsp; 6 Sept 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ATL version of the class<br />
//<br />
// Version 1.2&nbsp; 14 Oct 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a problem with loading GIFs from resources<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in MFC-version of the class for multi-modules apps.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Ruben Avila-Carretero for finding this out.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Got rid of waitable timer in ThreadAnimation()<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Now CPictureEx[Wnd] works in Win95 too.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Alex Egiazarov and Wayne King for the idea.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a visual glitch of using SetBkColor.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Kwangjin Lee for finding this out.<br />
//<br />
// Version 1.3&nbsp; 10 Nov 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a DC leak. One DC leaked per each UnLoad()<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forgot to put a ReleaseDC() in the end of <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPictureExWnd::PrepareDC() function).<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Now it is possible to set a clipping rectangle using<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPictureEx[Wnd]::SetPaintRect(const LPRECT) function.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The LPRECT parameter tells the class what portion of<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a picture should it display. If the clipping rect is <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not set, the whole picture is shown.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Fabrice Rodriguez for the idea.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Added support for Stop/Draw. Now you can Stop() an<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; animated GIF, then Draw() it again, it will continue<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; animation from the frame it was stopped on. You can <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; also know if a GIF is currently playing with the <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IsPlaying() function.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Got rid of math.h and made m_bExitThread volatile. <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Piotr Sawicki for the suggestion.<br />
//&nbsp;&nbsp;&nbsp;</span><a href="http://www.gjwtech.com/vcandc/vc1loadgifpicture.htm"><span style="font-size: 14px">http://www.gjwtech.com/vcandc/vc1loadgifpicture.htm</span></a><span style="font-size: 14px"><br />
//&nbsp;&nbsp;</span><a href="http://www.codeproject.com/KB/graphics/pictureex.aspx?df=100&amp;forumid=2691&amp;exp=0&amp;select=1026469"><span style="font-size: 14px">http://www.codeproject.com/KB/graphics/pictureex.aspx?df=100&amp;forumid=2691&amp;exp=0&amp;select=1026469</span></a></span><span style="font-size: 14px"><span style="font-family: 宋体"><br />
//////////////////////////////////////////////////////////////////////</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#if !defined(AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_)<br />
#define AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#if _MSC_VER &gt; 1000<br />
#pragma once<br />
#endif // _MSC_VER &gt; 1000</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#include &lt;vector&gt;</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">//#define GIF_TRACING&nbsp; // uncomment it if you want detailed TRACEs</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">class CPictureEx : public CStatic<br />
{<br />
public:</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TFrame&nbsp;&nbsp;&nbsp; // structure that keeps a single frame info<br />
{<br />
&nbsp;IPicture *m_pPicture;&nbsp; // pointer to the interface used for drawing<br />
&nbsp;SIZE&nbsp;&nbsp;&nbsp;&nbsp; m_frameSize;<br />
&nbsp;SIZE&nbsp;&nbsp;&nbsp;&nbsp; m_frameOffset;<br />
&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp; m_nDelay;&nbsp;&nbsp;&nbsp;&nbsp; // delay (in 1/100s of a second)<br />
&nbsp;UINT&nbsp;&nbsp;&nbsp;&nbsp; m_nDisposal;&nbsp; // disposal method<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#pragma pack(1)&nbsp;&nbsp; // turn byte alignment on</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">enum GIFBlockTypes<br />
{<br />
&nbsp;BLOCK_UNKNOWN,<br />
&nbsp;BLOCK_APPEXT,<br />
&nbsp;BLOCK_COMMEXT,<br />
&nbsp;BLOCK_CONTROLEXT,<br />
&nbsp;BLOCK_PLAINTEXT,<br />
&nbsp;BLOCK_IMAGE,<br />
&nbsp;BLOCK_TRAILER<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">enum ControlExtValues // graphic control extension packed field values<br />
{<br />
&nbsp;GCX_PACKED_DISPOSAL,&nbsp; // disposal method<br />
&nbsp;GCX_PACKED_USERINPUT,<br />
&nbsp;GCX_PACKED_TRANSPCOLOR<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">enum LSDPackedValues&nbsp; // logical screen descriptor packed field values<br />
{<br />
&nbsp;LSD_PACKED_GLOBALCT,<br />
&nbsp;LSD_PACKED_CRESOLUTION,<br />
&nbsp;LSD_PACKED_SORT,<br />
&nbsp;LSD_PACKED_GLOBALCTSIZE<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">enum IDPackedValues&nbsp;&nbsp; // image descriptor packed field values<br />
{<br />
&nbsp;ID_PACKED_LOCALCT,<br />
&nbsp;ID_PACKED_INTERLACE,<br />
&nbsp;ID_PACKED_SORT,<br />
&nbsp;ID_PACKED_LOCALCTSIZE<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFHeader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // GIF header&nbsp; <br />
{<br />
&nbsp;char m_cSignature[3]; // Signature - Identifies the GIF Data Stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This field contains the fixed value 'GIF'<br />
&nbsp;char m_cVersion[3];&nbsp;// Version number. May be one of the following:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// &quot;87a&quot; or &quot;89a&quot;<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFLSDescriptor // Logical Screen Descriptor<br />
{<br />
&nbsp;WORD m_wWidth;&nbsp;// 2 bytes. Logical screen width<br />
&nbsp;WORD m_wHeight; // 2 bytes. Logical screen height</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;unsigned char m_cPacked;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // packed field&nbsp;</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;unsigned char m_cBkIndex;&nbsp;&nbsp;&nbsp;&nbsp; // 1 byte. Background color index<br />
&nbsp;unsigned char m_cPixelAspect; // 1 byte. Pixel aspect ratio<br />
&nbsp;inline int GetPackedValue(enum LSDPackedValues Value);<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFAppExtension // application extension block<br />
{<br />
&nbsp;unsigned char m_cExtIntroducer; // extension introducer (0x21)<br />
&nbsp;unsigned char m_cExtLabel; // app. extension label (0xFF)<br />
&nbsp;unsigned char m_cBlockSize; // fixed value of 11<br />
&nbsp;char m_cAppIdentifier[8];&nbsp;&nbsp; // application identifier<br />
&nbsp;char m_cAppAuth[3];&nbsp; // application authentication code<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFControlExt // graphic control extension block<br />
{<br />
&nbsp;unsigned char m_cExtIntroducer; // extension introducer (0x21)<br />
&nbsp;unsigned char m_cControlLabel;&nbsp; // control extension label (0xF9)<br />
&nbsp;unsigned char m_cBlockSize; // fixed value of 4<br />
&nbsp;unsigned char m_cPacked;&nbsp;&nbsp;&nbsp; // packed field<br />
&nbsp;WORD m_wDelayTime;&nbsp;// delay time<br />
&nbsp;unsigned char m_cTColorIndex; // transparent color index<br />
&nbsp;unsigned char m_cBlockTerm;&nbsp;&nbsp; // block terminator (0x00)<br />
public:<br />
&nbsp;inline int GetPackedValue(enum ControlExtValues Value);<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFCommentExt&nbsp; // comment extension block<br />
{<br />
&nbsp;unsigned char m_cExtIntroducer; // extension introducer (0x21)<br />
&nbsp;unsigned char m_cCommentLabel;&nbsp; // comment extension label (0xFE)<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFPlainTextExt // plain text extension block<br />
{<br />
&nbsp;unsigned char m_cExtIntroducer;&nbsp; // extension introducer (0x21)<br />
&nbsp;unsigned char m_cPlainTextLabel; // text extension label (0x01)<br />
&nbsp;unsigned char m_cBlockSize; // fixed value of 12<br />
&nbsp;WORD m_wLeftPos;&nbsp;&nbsp;&nbsp; // text grid left position<br />
&nbsp;WORD m_wTopPos;&nbsp;&nbsp;&nbsp;&nbsp; // text grid top position<br />
&nbsp;WORD m_wGridWidth;&nbsp; // text grid width<br />
&nbsp;WORD m_wGridHeight; // text grid height<br />
&nbsp;unsigned char m_cCellWidth;&nbsp; // character cell width<br />
&nbsp;unsigned char m_cCellHeight; // character cell height<br />
&nbsp;unsigned char m_cFgColor; // text foreground color index<br />
&nbsp;unsigned char m_cBkColor; // text background color index<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">struct TGIFImageDescriptor // image descriptor block<br />
{<br />
&nbsp;unsigned char m_cImageSeparator; // image separator byte (0x2C)<br />
&nbsp;WORD m_wLeftPos; // image left position<br />
&nbsp;WORD m_wTopPos;&nbsp; // image top position<br />
&nbsp;WORD m_wWidth;&nbsp;&nbsp; // image width<br />
&nbsp;WORD m_wHeight;&nbsp; // image height<br />
&nbsp;unsigned char m_cPacked; // packed field<br />
&nbsp;inline int GetPackedValue(enum IDPackedValues Value);<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#pragma pack() // turn byte alignment off</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">public:<br />
&nbsp;BOOL GetPaintRect(RECT *lpRect);<br />
&nbsp;BOOL SetPaintRect(const RECT *lpRect);<br />
&nbsp;CPictureEx();<br />
&nbsp;virtual ~CPictureEx();<br />
&nbsp;void Stop();&nbsp;&nbsp; // stops animation<br />
&nbsp;void UnLoad(); // stops animation plus releases all resources</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;BOOL IsGIF() const;<br />
&nbsp;BOOL IsPlaying() const;<br />
&nbsp;BOOL IsAnimatedGIF() const;<br />
&nbsp;SIZE GetSize() const;<br />
&nbsp;int GetFrameCount() const;<br />
&nbsp;COLORREF GetBkColor() const;<br />
&nbsp;void SetBkColor(COLORREF clr);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;// draws the picture (starts an animation thread if needed)<br />
&nbsp;// if an animation was previously stopped by Stop(),<br />
&nbsp;// continues it from the last displayed frame<br />
&nbsp;BOOL Draw();</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;// loads a picture from a file<br />
&nbsp;// i.e. Load(_T(&quot;mypic.gif&quot;));<br />
&nbsp;BOOL Load(LPCTSTR szFileName);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;// loads a picture from a global memory block (allocated by GlobalAlloc)<br />
&nbsp;// Warning: this function DOES NOT free the global memory, pointed to by hGlobal<br />
&nbsp;BOOL Load(HGLOBAL hGlobal, DWORD dwSize);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;// loads a picture from a program resource<br />
&nbsp;// i.e. Load(MAKEINTRESOURCE(IDR_MYPIC),_T(&quot;GIFTYPE&quot;));<br />
&nbsp;BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">protected:</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#ifdef GIF_TRACING<br />
&nbsp;void EnumGIFBlocks();<br />
&nbsp;void WriteDataOnDisk(CString szFileName, HGLOBAL hData, DWORD dwSize);<br />
#endif // GIF_TRACING</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;RECT m_PaintRect;<br />
&nbsp;SIZE m_PictureSize;<br />
&nbsp;COLORREF m_clrBackground;<br />
&nbsp;UINT m_nCurrFrame;<br />
&nbsp;UINT m_nDataSize;<br />
&nbsp;UINT m_nCurrOffset;<br />
&nbsp;UINT m_nGlobalCTSize;<br />
&nbsp;BOOL m_bIsGIF;<br />
&nbsp;BOOL m_bIsPlaying;<br />
&nbsp;volatile BOOL m_bExitThread;<br />
&nbsp;BOOL m_bIsInitialized;<br />
&nbsp;HDC m_hMemDC;</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;HDC m_hDispMemDC;<br />
&nbsp;HBITMAP m_hDispMemBM;<br />
&nbsp;HBITMAP m_hDispOldBM;</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;HBITMAP m_hBitmap;<br />
&nbsp;HBITMAP m_hOldBitmap;<br />
&nbsp;HANDLE m_hThread;<br />
&nbsp;HANDLE m_hExitEvent;<br />
&nbsp;IPicture * m_pPicture;<br />
&nbsp;TGIFHeader * m_pGIFHeader;<br />
&nbsp;unsigned char * m_pRawData;<br />
&nbsp;TGIFLSDescriptor * m_pGIFLSDescriptor;<br />
&nbsp;std::vector&lt;TFrame&gt; m_arrFrames;</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;void ThreadAnimation();<br />
&nbsp;static UINT WINAPI _ThreadAnimation(LPVOID pParam);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;int GetNextBlockLen() const;<br />
&nbsp;BOOL SkipNextBlock();<br />
&nbsp;BOOL SkipNextGraphicBlock();<br />
&nbsp;BOOL PrepareDC(int nWidth, int nHeight);<br />
&nbsp;void ResetDataPointer();<br />
&nbsp;enum GIFBlockTypes GetNextBlock() const;<br />
&nbsp;UINT GetSubBlocksLen(UINT nStartingOffset) const;<br />
&nbsp;HGLOBAL GetNextGraphicBlock(UINT *pBlockLen, UINT *pDelay, <br />
&nbsp;&nbsp;SIZE *pBlockSize, SIZE *pBlockOffset, UINT *pDisposal);</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">&nbsp;// Generated message map functions<br />
&nbsp;//{{AFX_MSG(CPictureEx)<br />
&nbsp;afx_msg void OnDestroy();<br />
&nbsp;afx_msg void OnPaint();<br />
&nbsp;//}}AFX_MSG<br />
&nbsp;<br />
&nbsp;DECLARE_MESSAGE_MAP()<br />
};</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">#endif // !defined(AFX_PICTUREEX_H__0EFE5DE0_7B68_4DB7_8B34_5DC634948438__INCLUDED_)<br />
</span></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">//////////////////////////////////////////////////////////////////////</span></span></span></p>
<p><span style="font-size: 14px"><span style=""><span style="font-family: 宋体">////////////////////////PictureEx.cpp///////////////////////////</span></span><span style=""><span style="font-family: 宋体"><br />
// PictureEx.cpp: implementation of the CPictureEx class.<br />
//<br />
// Picture displaying control with support for the following formats:<br />
// GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR<br />
// <br />
// Written by Oleg Bykov (</span></span></span><span style="font-size: 12px"><a href="http://www.89zz.com/mailto:oleg_bykoff@rsdn.ru"><span style="font-size: 14px"><span style="font-family: 宋体">oleg_bykoff@rsdn.ru</span></span></a></span><span style="font-size: 14px"><span style="font-family: 宋体">)<br />
// Copyright (c) 2001<br />
//<br />
// To use CPictureEx, follow these steps:<br />
//&nbsp;&nbsp; - place a static control on your dialog (either a text or a bitmap)<br />
//&nbsp;&nbsp; - change its identifier to something else (e.g. IDC_MYPIC)<br />
//&nbsp;&nbsp; - associate a CStatic with it using ClassWizard<br />
//&nbsp;&nbsp; - in your dialog's header file replace CStatic with CPictureEx<br />
//&nbsp;&nbsp;&nbsp;&nbsp; (don't forget to #include &quot;PictureEx.h&quot; and add <br />
//&nbsp;&nbsp;&nbsp;&nbsp; PictureEx.h and PictureEx.cpp to your project)<br />
//&nbsp;&nbsp; - call one of the overloaded CPictureEx::Load() functions somewhere<br />
//&nbsp;&nbsp;&nbsp;&nbsp; (OnInitDialog is a good place to start)<br />
//&nbsp;&nbsp; - if the preceding Load() succeeded call Draw()<br />
//&nbsp; <br />
// You can also add the control by defining a member variable of type <br />
// CPictureEx, calling CPictureEx::Create (derived from CStatic), then <br />
// CPictureEx::Load and CPictureEx::Draw.<br />
//<br />
// By default, the control initializes its background to COLOR_3DFACE<br />
// (see CPictureEx::PrepareDC()). You can change the background by<br />
// calling CPictureEx::SetBkColor(COLORREF) after CPictureEx::Load().<br />
//<br />
// I decided to leave in the class the functions to write separate frames from <br />
// animated GIF to disk. If you want to use them, uncomment #define GIF_TRACING <br />
// and an appropriate section in CPictureEx::Load(HGLOBAL, DWORD). These functions <br />
// won't be compiled and linked to your project unless you uncomment #define GIF_TRACING,<br />
// so you don't have to worry.<br />
// <br />
// Warning: this code hasn't been subject to a heavy testing, so<br />
// use it on your own risk. The author accepts no liability for the <br />
// possible damage caused by this code.<br />
//<br />
// Version 1.0&nbsp; 7 Aug 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Initial release<br />
//<br />
// Version 1.1&nbsp; 6 Sept 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ATL version of the class<br />
//<br />
// Version 1.2&nbsp; 14 Oct 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a problem with loading GIFs from resources<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in MFC-version of the class for multi-modules apps.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Ruben Avila-Carretero for finding this out.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Got rid of waitable timer in ThreadAnimation()<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Now CPictureEx[Wnd] works in Win95 too.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Alex Egiazarov and Wayne King for the idea.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a visual glitch of using SetBkColor.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Kwangjin Lee for finding this out.<br />
//<br />
// Version 1.3&nbsp; 10 Nov 2001<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Fixed a DC leak. One DC leaked per each UnLoad()<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (forgot to put a ReleaseDC() in the end of <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPictureExWnd::PrepareDC() function).<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Now it is possible to set a clipping rectangle using<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPictureEx[Wnd]::SetPaintRect(const LPRECT) function.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The LPRECT parameter tells the class what portion of<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a picture should it display. If the clipping rect is <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not set, the whole picture is shown.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Fabrice Rodriguez for the idea.<br />
//<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Added support for Stop/Draw. Now you can Stop() an<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; animated GIF, then Draw() it again, it will continue<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; animation from the frame it was stopped on. You can <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; also know if a GIF is currently playing with the <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IsPlaying() function.<br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Got rid of math.h and made m_bExitThread volatile. <br />
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thanks to Piotr Sawicki for the suggestion.<br />
//&nbsp;&nbsp;</span></span><span style="font-size: 12px"><a href="http://www.gjwtech.com/vcandc/vc1loadgifpicture.htm"><span style="font-size: 14px"><span style="font-family: 宋体">http://www.gjwtech.com/vcandc/vc1loadgifpicture.htm</span></span></a></span><span style="font-size: 14px"><span style="font-family: 宋体"><br />
//&nbsp;&nbsp;</span></span><span style="font-size: 12px"><a href="http://www.codeproject.com/KB/graphics/pictureex.aspx?df=100&amp;forumid=2691&amp;exp=0&amp;select=1026469"><span style="font-size: 14px"><span style="font-family: 宋体">http://www.codeproject.com/KB/graphics/pictureex.aspx?df=100&amp;forumid=2691&amp;exp=0&amp;select=1026469</span></span></a></span><span style="font-size: 14px"><span style="font-family: 宋体"><br />
//////////////////////////////////////////////////////////////////////</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">#include &quot;stdafx.h&quot;<br />
#include &quot;PictureEx.h&quot;<br />
#include &lt;process.h&gt;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">#ifdef _DEBUG<br />
#undef THIS_FILE<br />
static char THIS_FILE[]=__FILE__;<br />
#define new DEBUG_NEW<br />
#endif</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">//////////////////////////////////////////////////////////////////////<br />
// Nested structures member functions<br />
//////////////////////////////////////////////////////////////////////</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">inline int CPictureEx::TGIFControlExt::GetPackedValue(enum ControlExtValues Value)<br />
{<br />
&nbsp;int nRet = (int)m_cPacked;<br />
&nbsp;switch (Value)<br />
&nbsp;{<br />
&nbsp;case GCX_PACKED_DISPOSAL:<br />
&nbsp;&nbsp;nRet = (nRet &amp; 28) &gt;&gt; 2;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case GCX_PACKED_USERINPUT:<br />
&nbsp;&nbsp;nRet = (nRet &amp; 2) &gt;&gt; 1;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case GCX_PACKED_TRANSPCOLOR:<br />
&nbsp;&nbsp;nRet &amp;= 1;<br />
&nbsp;&nbsp;break;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return nRet;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">inline int CPictureEx::TGIFLSDescriptor::GetPackedValue(enum LSDPackedValues Value)<br />
{<br />
&nbsp;int nRet = (int)m_cPacked;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;switch (Value)<br />
&nbsp;{<br />
&nbsp;case LSD_PACKED_GLOBALCT:<br />
&nbsp;&nbsp;nRet = nRet &gt;&gt; 7;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case LSD_PACKED_CRESOLUTION:<br />
&nbsp;&nbsp;nRet = ((nRet &amp; 0x70) &gt;&gt; 4) + 1;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case LSD_PACKED_SORT:<br />
&nbsp;&nbsp;nRet = (nRet &amp; 8) &gt;&gt; 3;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case LSD_PACKED_GLOBALCTSIZE:<br />
&nbsp;&nbsp;nRet &amp;= 7;<br />
&nbsp;&nbsp;break;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return nRet;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">inline int CPictureEx::TGIFImageDescriptor::GetPackedValue(enum IDPackedValues Value)<br />
{<br />
&nbsp;int nRet = (int)m_cPacked;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;switch (Value)<br />
&nbsp;{<br />
&nbsp;case ID_PACKED_LOCALCT:<br />
&nbsp;&nbsp;nRet &gt;&gt;= 7;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case ID_PACKED_INTERLACE:<br />
&nbsp;&nbsp;nRet = ((nRet &amp; 0x40) &gt;&gt; 6);<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case ID_PACKED_SORT:<br />
&nbsp;&nbsp;nRet = (nRet &amp; 0x20) &gt;&gt; 5;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case ID_PACKED_LOCALCTSIZE:<br />
&nbsp;&nbsp;nRet &amp;= 7;<br />
&nbsp;&nbsp;break;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return nRet;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体"><br />
//////////////////////////////////////////////////////////////////////<br />
// Construction/Destruction<br />
//////////////////////////////////////////////////////////////////////</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">CPictureEx::CPictureEx()<br />
{<br />
&nbsp;// check structures size<br />
&nbsp;ASSERT(sizeof(TGIFImageDescriptor) == 10);<br />
&nbsp;ASSERT(sizeof(TGIFAppExtension)&nbsp;&nbsp;&nbsp; == 14);<br />
&nbsp;ASSERT(sizeof(TGIFPlainTextExt)&nbsp;&nbsp;&nbsp; == 15);<br />
&nbsp;ASSERT(sizeof(TGIFLSDescriptor)&nbsp;&nbsp;&nbsp; ==&nbsp; 7);<br />
&nbsp;ASSERT(sizeof(TGIFControlExt)&nbsp;&nbsp;&nbsp; ==&nbsp; 8);<br />
&nbsp;ASSERT(sizeof(TGIFCommentExt)&nbsp;&nbsp;&nbsp; ==&nbsp; 2);<br />
&nbsp;ASSERT(sizeof(TGIFHeader)&nbsp;&nbsp;&nbsp;&nbsp; ==&nbsp; 6);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_pGIFLSDescriptor = NULL;<br />
&nbsp;m_pGIFHeader&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_pPicture&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_pRawData&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hThread&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hBitmap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hMemDC&nbsp;&nbsp;&nbsp;&nbsp; = NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_hDispMemDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hDispMemBM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hDispOldBM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_bIsInitialized&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_bExitThread&nbsp;&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_bIsPlaying&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_bIsGIF&nbsp;&nbsp;&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_clrBackground&nbsp;&nbsp;&nbsp; = RGB(255,255,255); // white by default<br />
&nbsp;m_nGlobalCTSize&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nCurrOffset&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nCurrFrame&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nDataSize&nbsp;&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_PictureSize.cx = m_PictureSize.cy = 0;<br />
&nbsp;SetRect(&amp;m_PaintRect,0,0,0,0);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_hExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL);<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">CPictureEx::~CPictureEx()<br />
{<br />
&nbsp;UnLoad();<br />
&nbsp;CloseHandle(m_hExitEvent);<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BEGIN_MESSAGE_MAP(CPictureEx, CStatic)<br />
&nbsp;//{{AFX_MSG_MAP(CPictureEx)<br />
&nbsp;ON_WM_DESTROY()<br />
&nbsp;ON_WM_PAINT()<br />
&nbsp;//}}AFX_MSG_MAP<br />
END_MESSAGE_MAP()</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::Load(HGLOBAL hGlobal, DWORD dwSize)<br />
{<br />
&nbsp;IStream *pStream = NULL;<br />
&nbsp;UnLoad();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (!(m_pRawData = reinterpret_cast&lt;unsigned char*&gt; (GlobalLock(hGlobal))) )<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load: Error locking memory\n&quot;));<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_nDataSize = dwSize;<br />
&nbsp;m_pGIFHeader = reinterpret_cast&lt;TGIFHeader *&gt; (m_pRawData);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if ((memcmp(&amp;m_pGIFHeader-&gt;m_cSignature,&quot;GIF&quot;,3) != 0) &amp;&amp;<br />
&nbsp;&nbsp;((memcmp(&amp;m_pGIFHeader-&gt;m_cVersion,&quot;87a&quot;,3) != 0) ||<br />
&nbsp;&nbsp; (memcmp(&amp;m_pGIFHeader-&gt;m_cVersion,&quot;89a&quot;,3) != 0)) )<br />
&nbsp;{<br />
&nbsp;// it's neither GIF87a nor GIF89a<br />
&nbsp;// do the default processing</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// clear GIF variables<br />
&nbsp;&nbsp;m_pRawData = NULL;<br />
&nbsp;&nbsp;GlobalUnlock(hGlobal);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// don't delete memory on object's release<br />
&nbsp;&nbsp;if (CreateStreamOnHGlobal(hGlobal,FALSE,&amp;pStream) != S_OK)<br />
&nbsp;&nbsp;&nbsp;return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if (OleLoadPicture(pStream,dwSize,FALSE,IID_IPicture,<br />
&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;LPVOID *&gt;(&amp;m_pPicture)) != S_OK)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;pStream-&gt;Release();<br />
&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;};<br />
&nbsp;&nbsp;pStream-&gt;Release();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// store picture's size</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;long hmWidth;<br />
&nbsp;&nbsp;long hmHeight;<br />
&nbsp;&nbsp;m_pPicture-&gt;get_Width(&amp;hmWidth);<br />
&nbsp;&nbsp;m_pPicture-&gt;get_Height(&amp;hmHeight);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;HDC hDC = ::GetDC(m_hWnd);<br />
&nbsp;&nbsp;m_PictureSize.cx = MulDiv(hmWidth, GetDeviceCaps(hDC,LOGPIXELSX), 2540);<br />
&nbsp;&nbsp;m_PictureSize.cy = MulDiv(hmHeight, GetDeviceCaps(hDC,LOGPIXELSY), 2540);<br />
&nbsp;&nbsp;::ReleaseDC(m_hWnd,hDC);<br />
&nbsp;}<br />
&nbsp;else<br />
&nbsp;{<br />
&nbsp;&nbsp;// it's a GIF<br />
&nbsp;&nbsp;m_bIsGIF = TRUE;<br />
&nbsp;&nbsp;m_pGIFLSDescriptor = reinterpret_cast&lt;TGIFLSDescriptor *&gt;<br />
&nbsp;&nbsp;&nbsp;(m_pRawData + sizeof(TGIFHeader));<br />
&nbsp;&nbsp;if (m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_GLOBALCT) == 1)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;// calculate the globat color table size<br />
&nbsp;&nbsp;&nbsp;m_nGlobalCTSize = static_cast&lt;int&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;(3* (1 &lt;&lt; (m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_GLOBALCTSIZE)+1)));<br />
&nbsp;&nbsp;&nbsp;// get the background color if GCT is present<br />
&nbsp;&nbsp;&nbsp;unsigned char *pBkClr = m_pRawData + sizeof(TGIFHeader) + <br />
&nbsp;&nbsp;&nbsp;&nbsp;sizeof(TGIFLSDescriptor) + 3*m_pGIFLSDescriptor-&gt;m_cBkIndex;<br />
&nbsp;&nbsp;&nbsp;m_clrBackground = RGB(pBkClr[0],pBkClr[1],pBkClr[2]);<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// store the picture's size<br />
&nbsp;&nbsp;m_PictureSize.cx = m_pGIFLSDescriptor-&gt;m_wWidth;<br />
&nbsp;&nbsp;m_PictureSize.cy = m_pGIFLSDescriptor-&gt;m_wHeight;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// determine frame count for this picture<br />
&nbsp;&nbsp;UINT nFrameCount=0;<br />
&nbsp;&nbsp;ResetDataPointer();<br />
&nbsp;&nbsp;while (SkipNextGraphicBlock())<br />
&nbsp;&nbsp;&nbsp;nFrameCount++;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">#ifdef GIF_TRACING<br />
&nbsp;&nbsp;TRACE(<br />
&nbsp;&nbsp;&nbsp;_T(&quot; -= GIF encountered\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Logical Screen dimensions = %dx%d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Global color table = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Color depth = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Sort flag = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Size of Global Color Table = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Background color index = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Pixel aspect ratio = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Frame count = %d\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Background color = %06Xh\n\n&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp; ),<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;m_wWidth,<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;m_wHeight,<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_GLOBALCT),<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_CRESOLUTION),<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_SORT),<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;GetPackedValue(LSD_PACKED_GLOBALCTSIZE),<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;m_cBkIndex,<br />
&nbsp;&nbsp;&nbsp;m_pGIFLSDescriptor-&gt;m_cPixelAspect,<br />
&nbsp;&nbsp;&nbsp;nFrameCount,<br />
&nbsp;&nbsp;&nbsp;m_clrBackground<br />
&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;EnumGIFBlocks();<br />
#endif</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if (nFrameCount == 0) // it's an empty GIF!<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;m_pRawData = NULL;<br />
&nbsp;&nbsp;&nbsp;GlobalUnlock(hGlobal);<br />
&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// now check the frame count<br />
&nbsp;&nbsp;// if there's only one frame, no need to animate this GIF<br />
&nbsp;&nbsp;// therefore, treat it like any other pic</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if (nFrameCount == 1)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;// clear GIF variables<br />
&nbsp;&nbsp;&nbsp;m_pRawData = NULL;<br />
&nbsp;&nbsp;&nbsp;GlobalUnlock(hGlobal);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;// don't delete memory on object's release<br />
&nbsp;&nbsp;&nbsp;if (CreateStreamOnHGlobal(hGlobal,FALSE,&amp;pStream) != S_OK)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;if (OleLoadPicture(pStream,dwSize,FALSE,IID_IPicture,<br />
&nbsp;&nbsp;&nbsp;&nbsp;(LPVOID *)&amp;m_pPicture) != S_OK)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pStream-&gt;Release();<br />
&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;pStream-&gt;Release();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;// if, on the contrary, there are several frames<br />
&nbsp;&nbsp;// then store separate frames in an array</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;TFrame frame;<br />
&nbsp;&nbsp;&nbsp;UINT nBlockLen;<br />
&nbsp;&nbsp;&nbsp;HGLOBAL hFrameData;<br />
&nbsp;&nbsp;&nbsp;UINT nCurFrame = 0;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;ResetDataPointer();<br />
&nbsp;&nbsp;&nbsp;while (hFrameData = GetNextGraphicBlock(&amp;nBlockLen,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&amp;frame.m_nDelay, &amp;frame.m_frameSize,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&amp;frame.m_frameOffset, &amp;frame.m_nDisposal) )<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;#ifdef GIF_TRACING<br />
&nbsp;&nbsp;&nbsp;&nbsp;//////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp;&nbsp;// uncomment the following strings if you want <br />
&nbsp;&nbsp;&nbsp;&nbsp;// to write separate frames on disk<br />
&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CString szName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;szName.Format(_T(&quot;%.4d.gif&quot;),nCurFrame);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;WriteDataOnDisk(szName,hFrameData,nBlockLen);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;nCurFrame++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;#endif // GIF_TRACING</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;IStream *pStream = NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;// delete memory on object's release<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (CreateStreamOnHGlobal(hFrameData,TRUE,&amp;pStream) != S_OK)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hFrameData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;if (OleLoadPicture(pStream,nBlockLen,FALSE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IPicture,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;LPVOID *&gt;(&amp;frame.m_pPicture)) != S_OK)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pStream-&gt;Release();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;pStream-&gt;Release();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// everything went well, add this frame<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames.push_back(frame);<br />
&nbsp;&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;// clean after ourselves<br />
&nbsp;&nbsp;&nbsp;m_pRawData = NULL;<br />
&nbsp;&nbsp;&nbsp;GlobalUnlock(hGlobal);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;if (m_arrFrames.empty()) // couldn't load any frames<br />
&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;};<br />
&nbsp;}; // if (!IsGIF...</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return PrepareDC(m_PictureSize.cx,m_PictureSize.cy);<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::UnLoad()<br />
{<br />
&nbsp;Stop();<br />
&nbsp;if (m_pPicture)<br />
&nbsp;{<br />
&nbsp;&nbsp;m_pPicture-&gt;Release();<br />
&nbsp;&nbsp;m_pPicture = NULL;<br />
&nbsp;};<br />
&nbsp;<br />
&nbsp;std::vector&lt;TFrame&gt;::iterator it;<br />
&nbsp;for (it=m_arrFrames.begin();it&lt;m_arrFrames.end();it++)<br />
&nbsp;&nbsp;(*it).m_pPicture-&gt;Release();<br />
&nbsp;m_arrFrames.clear();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (m_hMemDC)<br />
&nbsp;{<br />
&nbsp;&nbsp;SelectObject(m_hMemDC,m_hOldBitmap);<br />
&nbsp;&nbsp;::DeleteDC(m_hMemDC);<br />
&nbsp;&nbsp;::DeleteObject(m_hBitmap);<br />
&nbsp;&nbsp;m_hMemDC&nbsp; = NULL;<br />
&nbsp;&nbsp;m_hBitmap = NULL;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (m_hDispMemDC)<br />
&nbsp;{<br />
&nbsp;&nbsp;SelectObject(m_hDispMemDC,m_hDispOldBM);<br />
&nbsp;&nbsp;::DeleteDC(m_hDispMemDC);<br />
&nbsp;&nbsp;::DeleteObject(m_hDispMemBM);<br />
&nbsp;&nbsp;m_hDispMemDC&nbsp; = NULL;<br />
&nbsp;&nbsp;m_hDispMemBM = NULL;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;SetRect(&amp;m_PaintRect,0,0,0,0);<br />
&nbsp;m_pGIFLSDescriptor = NULL;<br />
&nbsp;m_pGIFHeader&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_pRawData&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_hThread&nbsp;&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp;m_bIsInitialized&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_bExitThread&nbsp;&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_bIsGIF&nbsp;&nbsp;&nbsp;&nbsp; = FALSE;<br />
&nbsp;m_clrBackground&nbsp;&nbsp;&nbsp; = RGB(255,255,255); // white by default<br />
&nbsp;m_nGlobalCTSize&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nCurrOffset&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nCurrFrame&nbsp;&nbsp;&nbsp; = 0;<br />
&nbsp;m_nDataSize&nbsp;&nbsp;&nbsp;&nbsp; = 0;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::Draw()<br />
{<br />
&nbsp;if (!m_bIsInitialized)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Call one of the CPictureEx::Load() member functions before calling Draw()\n&quot;));<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (IsAnimatedGIF())<br />
&nbsp;{<br />
&nbsp;// the picture needs animation<br />
&nbsp;// we'll start the thread that will handle it for us<br />
&nbsp;<br />
&nbsp;&nbsp;unsigned int nDummy;<br />
&nbsp;&nbsp;m_hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadAnimation,this,<br />
&nbsp;&nbsp;&nbsp;Create_SUSPENDED,&amp;nDummy);<br />
&nbsp;&nbsp;if (!m_hThread)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;Draw: Couldn't start a GIF animation thread\n&quot;));<br />
&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;else <br />
&nbsp;&nbsp;&nbsp;ResumeThread(m_hThread);<br />
&nbsp;} <br />
&nbsp;else<br />
&nbsp;{<br />
&nbsp;&nbsp;if (m_pPicture)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;long hmWidth;<br />
&nbsp;&nbsp;&nbsp;long hmHeight;<br />
&nbsp;&nbsp;&nbsp;m_pPicture-&gt;get_Width(&amp;hmWidth);<br />
&nbsp;&nbsp;&nbsp;m_pPicture-&gt;get_Height(&amp;hmHeight);<br />
&nbsp;&nbsp;&nbsp;if (m_pPicture-&gt;Render(m_hMemDC, 0, 0, m_PictureSize.cx, m_PictureSize.cy, <br />
&nbsp;&nbsp;&nbsp;&nbsp;0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Invalidate(FALSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;};<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return FALSE;&nbsp;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">SIZE CPictureEx::GetSize() const<br />
{<br />
&nbsp;return m_PictureSize;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::Load(LPCTSTR szFileName)<br />
{<br />
&nbsp;ASSERT(szFileName);<br />
&nbsp;<br />
&nbsp;CFile file;<br />
&nbsp;HGLOBAL hGlobal;<br />
&nbsp;DWORD dwSize;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (!file.Open(szFileName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;CFile::modeRead | <br />
&nbsp;&nbsp;&nbsp;&nbsp;CFile::shareDenyWrite) )<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (file): Error opening file %s\n&quot;),szFileName);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;dwSize = file.GetLength();<br />
&nbsp;hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize);<br />
&nbsp;if (!hGlobal)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (file): Error allocating memory\n&quot;));<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};<br />
&nbsp;<br />
&nbsp;char *pData = reinterpret_cast&lt;char*&gt;(GlobalLock(hGlobal));<br />
&nbsp;if (!pData)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (file): Error locking memory\n&quot;));<br />
&nbsp;&nbsp;GlobalFree(hGlobal);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;TRY<br />
&nbsp;{<br />
&nbsp;&nbsp;file.Read(pData,dwSize);<br />
&nbsp;}<br />
&nbsp;CATCH(CFileException, e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (file): An exception occured while reading the file %s\n&quot;),<br />
&nbsp;&nbsp;&nbsp;szFileName);<br />
&nbsp;&nbsp;GlobalFree(hGlobal);<br />
&nbsp;&nbsp;e-&gt;Delete();<br />
&nbsp;&nbsp;file.Close();<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;}<br />
&nbsp;END_CATCH<br />
&nbsp;GlobalUnlock(hGlobal);<br />
&nbsp;file.Close();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;BOOL bRetValue = Load(hGlobal,dwSize);<br />
&nbsp;GlobalFree(hGlobal);<br />
&nbsp;return bRetValue;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::Load(LPCTSTR szResourceName, LPCTSTR szResourceType)<br />
{<br />
&nbsp;ASSERT(szResourceName);<br />
&nbsp;ASSERT(szResourceType);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;HRSRC hPicture = FindResource(AfxGetResourceHandle(),szResourceName,szResourceType);<br />
&nbsp;HGLOBAL hResData;<br />
&nbsp;if (!hPicture || !(hResData = LoadResource(AfxGetResourceHandle(),hPicture)))<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (resource): Error loading resource %s\n&quot;),szResourceName);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};<br />
&nbsp;DWORD dwSize = SizeofResource(AfxGetResourceHandle(),hPicture);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// hResData is not the real HGLOBAL (we can't lock it)<br />
&nbsp;// let's make it real</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize);<br />
&nbsp;if (!hGlobal)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (resource): Error allocating memory\n&quot;));<br />
&nbsp;&nbsp;FreeResource(hResData);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};<br />
&nbsp;<br />
&nbsp;char *pDest = reinterpret_cast&lt;char *&gt; (GlobalLock(hGlobal));<br />
&nbsp;char *pSrc = reinterpret_cast&lt;char *&gt; (LockResource(hResData));<br />
&nbsp;if (!pSrc || !pDest)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;Load (resource): Error locking memory\n&quot;));<br />
&nbsp;&nbsp;GlobalFree(hGlobal);<br />
&nbsp;&nbsp;FreeResource(hResData);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};<br />
&nbsp;CopyMemory(pDest,pSrc,dwSize);<br />
&nbsp;FreeResource(hResData);<br />
&nbsp;GlobalUnlock(hGlobal);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;BOOL bRetValue = Load(hGlobal,dwSize);<br />
&nbsp;GlobalFree(hGlobal);<br />
&nbsp;return bRetValue;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::ResetDataPointer()<br />
{<br />
&nbsp;// skip header and logical screen descriptor<br />
&nbsp;m_nCurrOffset = <br />
&nbsp;&nbsp;sizeof(TGIFHeader)+sizeof(TGIFLSDescriptor)+m_nGlobalCTSize;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::SkipNextGraphicBlock()<br />
{<br />
&nbsp;if (!m_pRawData) return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// GIF header + LSDescriptor [+ GCT] [+ Control block] + Data</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;enum GIFBlockTypes nBlock;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;nBlock = GetNextBlock();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;while ((nBlock != BLOCK_CONTROLEXT) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_IMAGE) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_PLAINTEXT) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_UNKNOWN) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_TRAILER) )<br />
&nbsp;{<br />
&nbsp;&nbsp;if (!SkipNextBlock()) return NULL;<br />
&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if ((nBlock == BLOCK_UNKNOWN) ||<br />
&nbsp;&nbsp;(nBlock == BLOCK_TRAILER))<br />
&nbsp;&nbsp;return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// it's either a control ext.block, an image or a plain text</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (GetNextBlockLen() &lt;= 0) return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (nBlock == BLOCK_CONTROLEXT)<br />
&nbsp;{<br />
&nbsp;&nbsp;if (!SkipNextBlock()) return FALSE;<br />
&nbsp;&nbsp;nBlock = GetNextBlock();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;// skip everything until we meet an image block or a plain-text block<br />
&nbsp;&nbsp;while ((nBlock != BLOCK_IMAGE) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_PLAINTEXT) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_UNKNOWN) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nBlock != BLOCK_TRAILER) )<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if (!SkipNextBlock()) return NULL;<br />
&nbsp;&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if ((nBlock == BLOCK_UNKNOWN) ||<br />
&nbsp;&nbsp;&nbsp;(nBlock == BLOCK_TRAILER))<br />
&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// skip the found data block (image or plain-text)<br />
&nbsp;if (!SkipNextBlock()) return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return TRUE;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">UINT CPictureEx::GetSubBlocksLen(UINT nStartingOffset) const<br />
{<br />
&nbsp;UINT nRet = 0;<br />
&nbsp;UINT nCurOffset = nStartingOffset;<br />
&nbsp;<br />
&nbsp;while (m_pRawData[nCurOffset] != 0)<br />
&nbsp;{<br />
&nbsp;&nbsp;nRet += m_pRawData[nCurOffset]+1;<br />
&nbsp;&nbsp;nCurOffset += m_pRawData[nCurOffset]+1;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return nRet+1;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">enum CPictureEx::GIFBlockTypes CPictureEx::GetNextBlock() const<br />
{<br />
&nbsp;switch(m_pRawData[m_nCurrOffset])<br />
&nbsp;{<br />
&nbsp;case 0x21:<br />
&nbsp;// extension block<br />
&nbsp;&nbsp;switch(m_pRawData[m_nCurrOffset+1])<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;case 0x01:<br />
&nbsp;&nbsp;// plain text extension<br />
&nbsp;&nbsp;&nbsp;return BLOCK_PLAINTEXT;<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case 0xF9:<br />
&nbsp;&nbsp;// graphic control extension<br />
&nbsp;&nbsp;&nbsp;return BLOCK_CONTROLEXT;<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case 0xFE:<br />
&nbsp;&nbsp;// comment extension<br />
&nbsp;&nbsp;&nbsp;return BLOCK_COMMEXT;<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case 0xFF:<br />
&nbsp;&nbsp;// application extension<br />
&nbsp;&nbsp;&nbsp;return BLOCK_APPEXT;<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;};<br />
&nbsp;&nbsp;break;<br />
&nbsp;<br />
&nbsp;case 0x3B:<br />
&nbsp;// trailer<br />
&nbsp;&nbsp;return BLOCK_TRAILER;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case 0x2C:<br />
&nbsp;// image data<br />
&nbsp;&nbsp;return BLOCK_IMAGE;<br />
&nbsp;&nbsp;break;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return BLOCK_UNKNOWN;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::SkipNextBlock()<br />
{<br />
&nbsp;if (!m_pRawData) return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;int nLen = GetNextBlockLen();<br />
&nbsp;if ((nLen &lt;= 0) || ((m_nCurrOffset+nLen) &gt; m_nDataSize))<br />
&nbsp;&nbsp;return FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_nCurrOffset += nLen;<br />
&nbsp;return TRUE;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">int CPictureEx::GetNextBlockLen() const<br />
{<br />
&nbsp;GIFBlockTypes nBlock = GetNextBlock();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;int nTmp;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;switch(nBlock)<br />
&nbsp;{<br />
&nbsp;case BLOCK_UNKNOWN:<br />
&nbsp;&nbsp;return -1;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_TRAILER:<br />
&nbsp;&nbsp;return 1;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_APPEXT:<br />
&nbsp;&nbsp;nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFAppExtension));<br />
&nbsp;&nbsp;if (nTmp &gt; 0)<br />
&nbsp;&nbsp;&nbsp;return sizeof(TGIFAppExtension)+nTmp;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_COMMEXT:<br />
&nbsp;&nbsp;nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFCommentExt));<br />
&nbsp;&nbsp;if (nTmp &gt; 0)<br />
&nbsp;&nbsp;&nbsp;return sizeof(TGIFCommentExt)+nTmp;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_CONTROLEXT:<br />
&nbsp;&nbsp;return sizeof(TGIFControlExt);<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_PLAINTEXT:<br />
&nbsp;&nbsp;nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFPlainTextExt));<br />
&nbsp;&nbsp;if (nTmp &gt; 0)<br />
&nbsp;&nbsp;&nbsp;return sizeof(TGIFPlainTextExt)+nTmp;<br />
&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;case BLOCK_IMAGE:<br />
&nbsp;&nbsp;TGIFImageDescriptor *pIDescr = <br />
&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;TGIFImageDescriptor *&gt; (&amp;m_pRawData[m_nCurrOffset]);<br />
&nbsp;&nbsp;int nLCTSize = (int)<br />
&nbsp;&nbsp;&nbsp;(pIDescr-&gt;GetPackedValue(ID_PACKED_LOCALCT)*3*<br />
&nbsp;&nbsp;&nbsp;(1 &lt;&lt; (pIDescr-&gt;GetPackedValue(ID_PACKED_LOCALCTSIZE)+1)));</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;int nTmp = GetSubBlocksLen(m_nCurrOffset+<br />
&nbsp;&nbsp;&nbsp;sizeof(TGIFImageDescriptor) + nLCTSize + 1);<br />
&nbsp;&nbsp;if (nTmp &gt; 0)<br />
&nbsp;&nbsp;&nbsp;return sizeof(TGIFImageDescriptor) + nLCTSize + 1 + nTmp;<br />
&nbsp;&nbsp;break;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return 0;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">UINT WINAPI CPictureEx::_ThreadAnimation(LPVOID pParam)<br />
{<br />
&nbsp;ASSERT(pParam);<br />
&nbsp;CPictureEx *pPic = reinterpret_cast&lt;CPictureEx *&gt; (pParam);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;pPic-&gt;m_bIsPlaying = TRUE;<br />
&nbsp;pPic-&gt;ThreadAnimation();<br />
&nbsp;pPic-&gt;m_bIsPlaying = FALSE;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// this thread has finished its work so we close the handle<br />
&nbsp;CloseHandle(pPic-&gt;m_hThread); <br />
&nbsp;// and init the handle to zero (so that Stop() doesn't Wait on it)<br />
&nbsp;pPic-&gt;m_hThread = 0;<br />
&nbsp;return 0;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::ThreadAnimation()<br />
{<br />
&nbsp;// first, restore background (for stop/draw support)<br />
&nbsp;// disposal method #2<br />
&nbsp;if (m_arrFrames[m_nCurrFrame].m_nDisposal == 2)<br />
&nbsp;{<br />
&nbsp;&nbsp;HBRUSH hBrush = CreateSolidBrush(m_clrBackground);<br />
&nbsp;&nbsp;if (hBrush)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;RECT rect = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx + m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy + m_arrFrames[m_nCurrFrame].m_frameSize.cy };<br />
&nbsp;&nbsp;&nbsp;FillRect(m_hMemDC,&amp;rect,hBrush);<br />
&nbsp;&nbsp;&nbsp;DeleteObject(hBrush);<br />
&nbsp;&nbsp;};<br />
&nbsp;} <br />
&nbsp;else<br />
&nbsp;&nbsp;// disposal method #3<br />
&nbsp;&nbsp;if (m_hDispMemDC &amp;&amp; (m_arrFrames[m_nCurrFrame].m_nDisposal == 3) )<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;// put it back<br />
&nbsp;&nbsp;&nbsp;BitBlt(m_hMemDC,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_hDispMemDC,0,0, SRCCOPY);<br />
&nbsp;&nbsp;&nbsp;// init variables<br />
&nbsp;&nbsp;&nbsp;SelectObject(m_hDispMemDC,m_hDispOldBM);<br />
&nbsp;&nbsp;&nbsp;DeleteDC(m_hDispMemDC); m_hDispMemDC = NULL;<br />
&nbsp;&nbsp;&nbsp;DeleteObject(m_hDispMemBM); m_hDispMemBM = NULL;<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;while (!m_bExitThread)<br />
&nbsp;{<br />
&nbsp;&nbsp;if (m_arrFrames[m_nCurrFrame].m_pPicture)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;///////////////////////////////////////////////////////<br />
&nbsp;&nbsp;// Before rendering a frame we should take care of what's <br />
&nbsp;&nbsp;// behind that frame. TFrame::m_nDisposal will be our guide:<br />
&nbsp;&nbsp;//&nbsp;&nbsp; 0 - no disposal specified (do nothing)<br />
&nbsp;&nbsp;//&nbsp;&nbsp; 1 - do not dispose (again, do nothing)<br />
&nbsp;&nbsp;//&nbsp;&nbsp; 2 - restore to background color (m_clrBackground)<br />
&nbsp;&nbsp;//&nbsp;&nbsp; 3 - restore to previous</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;//////// disposal method #3<br />
&nbsp;&nbsp;&nbsp;if (m_arrFrames[m_nCurrFrame].m_nDisposal == 3)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// prepare a memory DC and store the background in it<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_hDispMemDC = CreateCompatibleDC(m_hMemDC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_hDispMemBM = CreateCompatibleBitmap(m_hMemDC,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cy);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (m_hDispMemDC &amp;&amp; m_hDispMemBM)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hDispOldBM = reinterpret_cast&lt;HBITMAP&gt; (SelectObject(m_hDispMemDC,m_hDispMemBM));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(m_hDispMemDC,0,0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hMemDC,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SRCCOPY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;///////////////////////</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;long hmWidth;<br />
&nbsp;&nbsp;&nbsp;long hmHeight;<br />
&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_pPicture-&gt;get_Width(&amp;hmWidth);<br />
&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_pPicture-&gt;get_Height(&amp;hmHeight);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;if (m_arrFrames[m_nCurrFrame].m_pPicture-&gt;Render(m_hMemDC, <br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx, <br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy, <br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cx, <br />
&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cy, <br />
&nbsp;&nbsp;&nbsp;&nbsp;0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Invalidate(FALSE);<br />
&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;if (m_bExitThread) break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;// if the delay time is too short (like in old GIFs), wait for 100ms<br />
&nbsp;&nbsp;&nbsp;if (m_arrFrames[m_nCurrFrame].m_nDelay &lt; 5) <br />
&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject(m_hExitEvent, 100);<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject(m_hExitEvent, 10*m_arrFrames[m_nCurrFrame].m_nDelay);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;if (m_bExitThread) break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;// disposal method #2<br />
&nbsp;&nbsp;&nbsp;if (m_arrFrames[m_nCurrFrame].m_nDisposal == 2)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;HBRUSH hBrush = CreateSolidBrush(m_clrBackground);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (hBrush)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RECT rect = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx + m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy + m_arrFrames[m_nCurrFrame].m_frameSize.cy };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillRect(m_hMemDC,&amp;rect,hBrush);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hBrush);<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (m_hDispMemDC &amp;&amp; (m_arrFrames[m_nCurrFrame].m_nDisposal == 3) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// put it back<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(m_hMemDC,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameOffset.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cx,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrFrames[m_nCurrFrame].m_frameSize.cy,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hDispMemDC,0,0, SRCCOPY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// init variables<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(m_hDispMemDC,m_hDispOldBM);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(m_hDispMemDC); m_hDispMemDC = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(m_hDispMemBM); m_hDispMemBM = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;};<br />
&nbsp;&nbsp;m_nCurrFrame++;<br />
&nbsp;&nbsp;if (m_nCurrFrame == m_arrFrames.size())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;m_nCurrFrame<br />
&nbsp;&nbsp;&nbsp;&nbsp;= 0; <br />
&nbsp;&nbsp;// init the screen for the first frame,<br />
&nbsp;&nbsp;&nbsp;HBRUSH hBrush = CreateSolidBrush(m_clrBackground);<br />
&nbsp;&nbsp;&nbsp;if (hBrush)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;RECT rect = {0,0,m_PictureSize.cx,m_PictureSize.cy};<br />
&nbsp;&nbsp;&nbsp;&nbsp;FillRect(m_hMemDC,&amp;rect,hBrush);<br />
&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hBrush);<br />
&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;};<br />
&nbsp;};<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::Stop()<br />
{<br />
&nbsp;m_bIsPlaying = FALSE;<br />
&nbsp;m_bExitThread = TRUE;<br />
&nbsp;SetEvent(m_hExitEvent);<br />
&nbsp;if (m_hThread)<br />
&nbsp;{<br />
&nbsp;&nbsp;// we'll wait for 5 seconds then continue execution<br />
&nbsp;&nbsp;WaitForSingleObject(m_hThread,5000);<br />
&nbsp;&nbsp;CloseHandle(m_hThread);<br />
&nbsp;&nbsp;m_hThread = NULL;<br />
&nbsp;}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// make it possible to Draw() again<br />
&nbsp;ResetEvent(m_hExitEvent);<br />
&nbsp;m_bExitThread = FALSE;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">HGLOBAL CPictureEx::GetNextGraphicBlock(UINT *pBlockLen, <br />
&nbsp;UINT *pDelay, SIZE *pBlockSize, SIZE *pBlockOffset, <br />
&nbsp;UINT *pDisposal)<br />
{<br />
&nbsp;if (!m_pRawData) return NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// GIF header + LSDescriptor [+ GCT] [+ Control block] + Data</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;*pDisposal = 0;<br />
&nbsp;enum GIFBlockTypes nBlock;<br />
&nbsp;nBlock = GetNextBlock();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;while (<br />
&nbsp;&nbsp;(nBlock != BLOCK_CONTROLEXT) &amp;&amp;<br />
&nbsp;&nbsp;(nBlock != BLOCK_IMAGE) &amp;&amp;<br />
&nbsp;&nbsp;(nBlock != BLOCK_PLAINTEXT) &amp;&amp;<br />
&nbsp;&nbsp;(nBlock != BLOCK_UNKNOWN) &amp;&amp;<br />
&nbsp;&nbsp;(nBlock != BLOCK_TRAILER)<br />
&nbsp;&nbsp;)<br />
&nbsp;{<br />
&nbsp;&nbsp;if (!SkipNextBlock()) return NULL;<br />
&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if ((nBlock == BLOCK_UNKNOWN) ||<br />
&nbsp;&nbsp;(nBlock == BLOCK_TRAILER))<br />
&nbsp;&nbsp;return NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// it's either a control ext.block, an image or a plain text</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;int nStart = m_nCurrOffset;<br />
&nbsp;int nBlockLen = GetNextBlockLen();</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (nBlockLen &lt;= 0) return NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (nBlock == BLOCK_CONTROLEXT)<br />
&nbsp;{<br />
&nbsp;&nbsp;// get the following data<br />
&nbsp;&nbsp;TGIFControlExt *pControl = <br />
&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;TGIFControlExt *&gt; (&amp;m_pRawData[m_nCurrOffset]);<br />
&nbsp;&nbsp;// store delay time<br />
&nbsp;&nbsp;*pDelay = pControl-&gt;m_wDelayTime;<br />
&nbsp;&nbsp;// store disposal method<br />
&nbsp;&nbsp;*pDisposal = pControl-&gt;GetPackedValue(GCX_PACKED_DISPOSAL);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if (!SkipNextBlock()) return NULL;<br />
&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// skip everything until we find data to display <br />
&nbsp;&nbsp;// (image block or plain-text block)<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;while (<br />
&nbsp;&nbsp;&nbsp;(nBlock != BLOCK_IMAGE) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;(nBlock != BLOCK_PLAINTEXT) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;(nBlock != BLOCK_UNKNOWN) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;(nBlock != BLOCK_TRAILER)<br />
&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if (!SkipNextBlock()) return NULL;<br />
&nbsp;&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;&nbsp;&nbsp;nBlockLen += GetNextBlockLen();<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;if ((nBlock == BLOCK_UNKNOWN) || (nBlock == BLOCK_TRAILER))<br />
&nbsp;&nbsp;&nbsp;return NULL;<br />
&nbsp;&nbsp;nBlockLen += GetNextBlockLen();<br />
&nbsp;}<br />
&nbsp;else<br />
&nbsp;&nbsp;*pDelay = -1; // to indicate that there was no delay value</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (nBlock == BLOCK_IMAGE)<br />
&nbsp;{<br />
&nbsp;&nbsp;// store size and offsets<br />
&nbsp;&nbsp;TGIFImageDescriptor *pImage = <br />
&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;TGIFImageDescriptor *&gt; (&amp;m_pRawData[m_nCurrOffset]);<br />
&nbsp;&nbsp;pBlockSize-&gt;cx = pImage-&gt;m_wWidth;<br />
&nbsp;&nbsp;pBlockSize-&gt;cy = pImage-&gt;m_wHeight;<br />
&nbsp;&nbsp;pBlockOffset-&gt;cx = pImage-&gt;m_wLeftPos;<br />
&nbsp;&nbsp;pBlockOffset-&gt;cy = pImage-&gt;m_wTopPos;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (!SkipNextBlock()) return NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED,<br />
&nbsp;&nbsp;sizeof(TGIFHeader) +<br />
&nbsp;&nbsp;sizeof(TGIFLSDescriptor) +<br />
&nbsp;&nbsp;m_nGlobalCTSize +<br />
&nbsp;&nbsp;nBlockLen + <br />
&nbsp;&nbsp;1);&nbsp; // for the trailer</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (!hGlobal) return NULL;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;int nOffset = 0;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;// GMEM_FIXED means we get a pointer<br />
&nbsp;unsigned char *pGlobal = reinterpret_cast&lt;unsigned char *&gt; (hGlobal);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;CopyMemory(pGlobal,m_pRawData, <br />
&nbsp;&nbsp;sizeof(TGIFHeader)+sizeof(TGIFLSDescriptor)+m_nGlobalCTSize);<br />
&nbsp;nOffset += sizeof(TGIFHeader)+sizeof(TGIFLSDescriptor)+m_nGlobalCTSize;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;CopyMemory(pGlobal + nOffset,&amp;m_pRawData[nStart], nBlockLen);<br />
&nbsp;nOffset += nBlockLen;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;pGlobal[nOffset] = 0x3B; // trailer<br />
&nbsp;nOffset++;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;*pBlockLen = nOffset;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return hGlobal;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::IsGIF() const<br />
{<br />
&nbsp;return m_bIsGIF;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::IsAnimatedGIF() const<br />
{<br />
&nbsp;return (m_bIsGIF &amp;&amp; (m_arrFrames.size() &gt; 1));<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::IsPlaying() const<br />
{<br />
&nbsp;return m_bIsPlaying;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">int CPictureEx::GetFrameCount() const<br />
{<br />
&nbsp;if (!IsAnimatedGIF())<br />
&nbsp;&nbsp;return 0;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;return m_arrFrames.size();<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">COLORREF CPictureEx::GetBkColor() const<br />
{<br />
&nbsp;return m_clrBackground;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::OnPaint() <br />
{<br />
&nbsp;CPaintDC dc(this); // device context for painting</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;LONG nPaintWidth = m_PaintRect.right-m_PaintRect.left;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (nPaintWidth &gt; 0)<br />
&nbsp;{<br />
&nbsp;&nbsp;LONG nPaintHeight = m_PaintRect.bottom - m_PaintRect.top;<br />
&nbsp;&nbsp;::BitBlt(dc.m_hDC, 0, 0, nPaintWidth, nPaintHeight,&nbsp;<br />
&nbsp;&nbsp;&nbsp;m_hMemDC, m_PaintRect.left, m_PaintRect.top, SRCCOPY);<br />
&nbsp;}<br />
&nbsp;else<br />
&nbsp;{<br />
&nbsp;&nbsp;::BitBlt(dc.m_hDC, 0, 0, m_PictureSize.cx, m_PictureSize.cy,<br />
&nbsp;&nbsp;&nbsp;m_hMemDC, 0, 0, SRCCOPY);<br />
&nbsp;};<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::PrepareDC(int nWidth, int nHeight)<br />
{<br />
&nbsp;SetWindowPos(NULL,0,0,nWidth,nHeight,SWP_NOMOVE | SWP_NOZORDER);</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;HDC hWinDC = ::GetDC(m_hWnd);<br />
&nbsp;if (!hWinDC) return FALSE;<br />
&nbsp;<br />
&nbsp;m_hMemDC = CreateCompatibleDC(hWinDC);<br />
&nbsp;if (!m_hMemDC) <br />
&nbsp;{<br />
&nbsp;&nbsp;::ReleaseDC(m_hWnd,hWinDC);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_hBitmap&nbsp; = CreateCompatibleBitmap(hWinDC,nWidth,nHeight);<br />
&nbsp;if (!m_hBitmap) <br />
&nbsp;{<br />
&nbsp;&nbsp;::ReleaseDC(m_hWnd,hWinDC);<br />
&nbsp;&nbsp;::DeleteDC(m_hMemDC);<br />
&nbsp;&nbsp;return FALSE;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_hOldBitmap = reinterpret_cast&lt;HBITMAP&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SelectObject(m_hMemDC,m_hBitmap));<br />
&nbsp;<br />
&nbsp;// fill the background<br />
&nbsp;m_clrBackground = GetSysColor(COLOR_3DFACE);<br />
&nbsp;RECT rect = {0,0,nWidth,nHeight};<br />
&nbsp;FillRect(m_hMemDC,&amp;rect,(HBRUSH)(COLOR_WINDOW));</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;::ReleaseDC(m_hWnd,hWinDC);<br />
&nbsp;m_bIsInitialized = TRUE;<br />
&nbsp;return TRUE;<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::OnDestroy() <br />
{<br />
&nbsp;Stop();&nbsp;<br />
&nbsp;CStatic::OnDestroy();<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::SetBkColor(COLORREF clr)<br />
{<br />
&nbsp;if (!m_bIsInitialized) return;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;m_clrBackground = clr;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;HBRUSH hBrush = CreateSolidBrush(clr);<br />
&nbsp;if (hBrush)<br />
&nbsp;{<br />
&nbsp;&nbsp;RECT rect = {0,0,m_PictureSize.cx,m_PictureSize.cy};<br />
&nbsp;&nbsp;FillRect(m_hMemDC,&amp;rect,hBrush);<br />
&nbsp;&nbsp;DeleteObject(hBrush);<br />
&nbsp;};<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">#ifdef GIF_TRACING<br />
void CPictureEx::WriteDataOnDisk(CString szFileName, HGLOBAL hData, DWORD dwSize)<br />
{<br />
&nbsp;CFile file;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;if (!file.Open(szFileName,<br />
&nbsp;&nbsp;&nbsp;CFile::modeCreate |<br />
&nbsp;&nbsp;&nbsp;CFile::modeWrite |<br />
&nbsp;&nbsp;&nbsp;CFile::shareDenyNone))<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;WriteData: Error creating file %s\n&quot;),szFileName);<br />
&nbsp;&nbsp;return;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;char *pData = reinterpret_cast&lt;char *&gt; (GlobalLock(hData));<br />
&nbsp;if (!pData)<br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;WriteData: Error locking memory\n&quot;));<br />
&nbsp;&nbsp;return;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;TRY<br />
&nbsp;{<br />
&nbsp;&nbsp;file.Write(pData,dwSize);<br />
&nbsp;}<br />
&nbsp;CATCH(CFileException, e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;{<br />
&nbsp;&nbsp;TRACE(_T(&quot;WriteData: An exception occured while writing to the file %s\n&quot;),<br />
&nbsp;&nbsp;&nbsp;szFileName);<br />
&nbsp;&nbsp;e-&gt;Delete();<br />
&nbsp;&nbsp;GlobalUnlock(hData);<br />
&nbsp;&nbsp;file.Close();<br />
&nbsp;&nbsp;return;<br />
&nbsp;}<br />
&nbsp;END_CATCH<br />
&nbsp;<br />
&nbsp;GlobalUnlock(hData);<br />
&nbsp;file.Close();<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">void CPictureEx::EnumGIFBlocks()<br />
{<br />
&nbsp;enum GIFBlockTypes nBlock;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;ResetDataPointer();<br />
&nbsp;while(m_nCurrOffset &lt; m_nDataSize)<br />
&nbsp;{<br />
&nbsp;&nbsp;nBlock = GetNextBlock();<br />
&nbsp;&nbsp;switch(nBlock)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;case BLOCK_UNKNOWN:<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Unknown block\n&quot;));<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_TRAILER:<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Trailer block\n&quot;));<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_APPEXT:<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Application extension block\n&quot;));<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_COMMEXT:<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Comment extension block\n&quot;));<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_CONTROLEXT:<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;TGIFControlExt *pControl = <br />
&nbsp;&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;TGIFControlExt *&gt; (&amp;m_pRawData[m_nCurrOffset]);<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Graphic control extension block (delay %d, disposal %d)\n&quot;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pControl-&gt;m_wDelayTime, pControl-&gt;GetPackedValue(GCX_PACKED_DISPOSAL));<br />
&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_PLAINTEXT:<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Plain text extension block\n&quot;));<br />
&nbsp;&nbsp;&nbsp;break;</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;case BLOCK_IMAGE:<br />
&nbsp;&nbsp;&nbsp;TGIFImageDescriptor *pIDescr = <br />
&nbsp;&nbsp;&nbsp;&nbsp;reinterpret_cast&lt;TGIFImageDescriptor *&gt; (&amp;m_pRawData[m_nCurrOffset]);<br />
&nbsp;&nbsp;&nbsp;TRACE(_T(&quot;- Image data block (%dx%d&nbsp; %d,%d)\n&quot;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIDescr-&gt;m_wWidth,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIDescr-&gt;m_wHeight,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIDescr-&gt;m_wLeftPos,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIDescr-&gt;m_wTopPos);<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;&nbsp;SkipNextBlock();&nbsp;<br />
&nbsp;};</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">&nbsp;TRACE(_T(&quot;\n&quot;));<br />
}<br />
#endif // GIF_TRACING</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::SetPaintRect(const RECT *lpRect)<br />
{<br />
&nbsp;return CopyRect(&amp;m_PaintRect, lpRect);<br />
}</span></span></p>
<p><span style="font-size: 14px"><span style="font-family: 宋体">BOOL CPictureEx::GetPaintRect(RECT *lpRect)<br />
{<br />
&nbsp;return CopyRect(lpRect, &amp;m_PaintRect);<br />
}<br />
&nbsp;</span></span></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/314.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=314</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[显摆一个！我的移动装备！]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=8" label="日記┊碎碎念念" /> 
	  <updated>2008-10-23T00:41:04+08:00</updated>
	  <published>2008-10-23T00:41:04+08:00</published>
		  <summary type="html"><![CDATA[整天在外面跑，用的手机也换了N个了。下面给大家看看。都是经典，至少是过去的经典。<br/>随便纪念一下他们。<br/>准备败一个苹果了。让他们沉睡吧|！<br/>从左到右 依次是 黑莓7290&nbsp;&nbsp; 多普达838&nbsp;&nbsp;奔迈680&nbsp;&nbsp; 多普达D600<br/><br/><img src="http://www.89zz.com/attachments/month_0810/x2008102304050.jpg" border="0" alt=""/><br/><br/><img src="http://www.89zz.com/attachments/month_0810/32008102304056.jpg" border="0" alt=""/><br/><br/><img src="http://www.89zz.com/attachments/month_0810/8200810230412.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/313.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=313</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[海蜘蛛软路由动画教程＋免费版下载]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=40" label="學習┊教程基地" /> 
	  <updated>2008-10-06T01:06:23+08:00</updated>
	  <published>2008-10-06T01:06:23+08:00</published>
		  <summary type="html"><![CDATA[海蜘蛛软路由动画教程<br/><br/><img src="http://www.89zz.com/attachments/month_0810/a200810611222.jpg" border="0" alt=""/><br/><br/><br/><a target="_blank" href="http://down.89zz.com/海蜘蛛软路由动画教程.rar" rel="external">http://down.89zz.com/海蜘蛛软路由动画教程.rar</a><br/><br/>海蜘蛛免费版<br/><br/><a href="http://www.hi-spider.com/html/dl_hsrouter_free.htm" target="_blank" rel="external">http://www.hi-spider.com/html/dl_hsrouter_free.htm</a><br/><br/><img src="http://www.89zz.com/attachments/month_0810/1200810611236.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/312.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=312</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[网吧主页开发中-首页预览图(待细化)]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=57" label="动态┊本站動態" /> 
	  <updated>2008-10-02T18:00:46+08:00</updated>
	  <published>2008-10-02T18:00:46+08:00</published>
		  <summary type="html"><![CDATA[<img src="http://www.89zz.com/attachments/month_0810/h200810218044.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/310.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=310</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[给一个网吧做的电影导航页（没细化前）]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=8" label="日記┊碎碎念念" /> 
	  <updated>2008-10-02T17:28:32+08:00</updated>
	  <published>2008-10-02T17:28:32+08:00</published>
		  <summary type="html"><![CDATA[<img src="http://www.89zz.com/attachments/month_0810/02008102172831.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/309.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=309</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[再发一个客户网吧的桌面！]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=8" label="日記┊碎碎念念" /> 
	  <updated>2008-09-30T23:54:57+08:00</updated>
	  <published>2008-09-30T23:54:57+08:00</published>
		  <summary type="html"><![CDATA[<img src="http://www.89zz.com/attachments/month_0809/92008930235456.jpg" border="0" alt=""/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/308.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=308</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[解决Vista或WIN2008文件或文件夹不存在的真实方法 ]]></title>
	  <author>
		 <name>墨魚</name>
		 <uri>http://www.89zz.com/</uri>
		 <email>hanxing3437@126.com</email>
	  </author>
	  <category term="" scheme="http://www.89zz.com/default.asp?cateID=7" label="文章┊網海拾貝" /> 
	  <updated>2008-09-25T17:23:39+08:00</updated>
	  <published>2008-09-25T17:23:39+08:00</published>
		  <summary type="html"><![CDATA[最近，网络上有关Windows vista系统下重命名文件时系统提示“文件或文件夹不存在”的问题一直在困扰着大家。对于这个问题，之前一直没有彻底解决的方法。不过现在好了，网络上有高手给出了一个解决方案，方法仍然是大家都很熟悉的修改注册表。 <br/>　　由于这里所要修改的注册表的项和键值有很多处，于是这位网友写了一个注册表文件，大家只要将该文件下载并导入到注册表中就可以了。<br/><br/><img src="http://www.89zz.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.89zz.com/attachments/month_0809/u200892517225.rar" target="_blank">点击下载“Vista文件或文件夹不存在”补丁<br/></a><br/><br/>　　下载后，直接双击reg文件，系统会弹出如下提示信息（如下图）：<br/><br/><img src="http://www.89zz.com/attachments/month_0809/j2008925172127.jpg" border="0" alt=""/><br/><br/><br/>　　单击“是”按钮即可导入注册表中了。<br/><br/>　　小提示：<br/><br/>　　目前，引起这个问题的原因已经还无定论，集成在两个方面，一个是网友使用了一些网络上流传的“精简版Vista”。由于此类版本的Vista都是一些系统爱好者制作发布，并不是每个版本都很“完美”，在功能组件的取舍上一不小心就会出现问题。<br/><br/>　　此外，也有网友称，出现上述问题是由于更新了微软提供的KB 938979补丁造成的，原因是KB 938979补丁删除了注册表中的HKLM\Software\Microsoft\Windows<br/>\CurrentVersion\explorer\FolderDescriptions branch，即便使用户卸载该补丁也不行，只能进行注册表修补。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.89zz.com/article/307.htm" /> 
	  <id>http://www.89zz.com/default.asp?id=307</id>
  </entry>	
		
</feed>
