求一个在对话框显示GIF动画的方法 用了那个CExplorer1控件,但是没见效,很不明白怎么用,说是用CWebBrowser2,可是右键点击插入ActiveX控件、怎么VC2008没有找到这个WebBrowser控件?请高手指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找一些网上的能显示GIF的ActiveX控件吧。应该有很多 GOOGLE CPictureEx 或 ImageEx 使用 CHtmlView,直接用HTML显示 强烈推荐CPICTUREEX类,使用很方便。 自己用GDI+写的一个静态控件可以显示GIF希望对你有帮助,cpp里面有个定时器ID你自己定义一下// .h#pragma once#include <gdiplus.h>using namespace Gdiplus;class GdiPlusInstance{public: GdiPlusInstance(); ~GdiPlusInstance(); protected: ULONG_PTR m_gdiplusToken; GdiplusStartupInput m_input;};class CGIFStaticControl : public CStatic{ DECLARE_DYNCREATE(CGIFStaticControl)public: CGIFStaticControl(void); ~CGIFStaticControl(void);public: /** * 从文件加载 */ BOOL LoadGIFImage(const CString& strImageFileName); /** * 从资源加载 */ BOOL LoadGIFImage(UINT nID); /** * 自定义延时时间,单位毫秒 */ void SetCustomDelayTime(DWORD dwMilliseconds); /** * 获取自定义延时时间 */ DWORD GetCustomDelayTime() const; /** * 设置使用延时时间类型 */ void SetDelayTimeType(BOOL bCustom); /** * 是否使用用户自定义延时时间 */ BOOL IsUsedCustomDelayTime() const;protected: BOOL Init(); void Draw(); void Draw(CDC* pDC); void FreeResource(); BOOL GetDelayTime(UINT nFrameNumber, UINT& nDelayTime);protected: // 安装GDI+ GdiPlusInstance m_Instance; // 图像对象 Image* m_pImage; // 图像大小 CSize m_szImage; // 图像维数尺度GUID指针链表 GUID* m_pDimensionIDs; // 尺度数量 UINT m_nFrameDimensionsCount; // 图像帧个数 UINT m_nFrames; // 当前播放的帧 UINT m_nCurrentFrame; // 用于绘制图像的定时器 UINT_PTR m_nTimer; // 元数据属性数量 UINT m_nPropertysCount; // 元数据属性标识指针链表 PROPID* m_pPropIDs; // 指定数据属性标识对应属性块大小 UINT m_nPropSize; // 属性内容 PropertyItem* m_pPorertyItem; // 延时时间 UINT m_nDelayTime; // 用户自定应延时时间 DWORD m_dwCustomDelayTime; // 使用延时时间类型 BOOL m_bCustom; // 存储资源内存块 HGLOBAL m_hMem;public: DECLARE_MESSAGE_MAP() afx_msg void OnPaint(); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); afx_msg BOOL OnEraseBkgnd(CDC* pDC);}; // .cpp#include "StdAfx.h"#include "GIFStaticControl.h"GdiPlusInstance::GdiPlusInstance(){ GdiplusStartup(&m_gdiplusToken, &m_input, NULL);}GdiPlusInstance::~GdiPlusInstance(){ GdiplusShutdown(m_gdiplusToken);}IMPLEMENT_DYNCREATE(CGIFStaticControl, CStatic)CGIFStaticControl::CGIFStaticControl(void){ m_nTimer = 0; m_nFrames = 0; m_nCurrentFrame = 0; m_pImage = NULL; m_hMem = NULL; m_nFrameDimensionsCount = 0; m_pDimensionIDs = NULL; m_nPropertysCount = 0; m_pPropIDs = NULL; m_nPropSize = 0; m_pPorertyItem = NULL; m_nDelayTime = 100; m_bCustom = FALSE; m_dwCustomDelayTime = 200;}CGIFStaticControl::~CGIFStaticControl(void){// FreeResource();}BOOL CGIFStaticControl::LoadGIFImage(const CString& strImageFileName){ FreeResource(); m_pImage = new Image(strImageFileName, FALSE); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } return Init();}BOOL CGIFStaticControl::LoadGIFImage(UINT nID){ FreeResource(); HINSTANCE hInstance = AfxGetInstanceHandle(); HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nID), _T("GIF")); if (!hRsrc) return FALSE; // load resource into memory DWORD len = ::SizeofResource(hInstance, hRsrc); BYTE* lpRsrc = (BYTE*)::LoadResource(hInstance, hRsrc); if (!lpRsrc) return FALSE; // Allocate global memory on which to create stream m_hMem = GlobalAlloc(GMEM_FIXED, len); BYTE* pmem = (BYTE*)GlobalLock(m_hMem); memcpy(pmem,lpRsrc,len); IStream* pstm; ::CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream m_pImage = Gdiplus::Image::FromStream(pstm); // free/release stuff ::GlobalUnlock(m_hMem); pstm->Release(); ::FreeResource(lpRsrc); return Init();}BOOL CGIFStaticControl::Init(){ if(!m_pImage) return FALSE; m_szImage.cx = m_pImage->GetWidth(); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } m_szImage.cy = m_pImage->GetHeight(); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } // 获取帧维数 m_nFrameDimensionsCount = m_pImage->GetFrameDimensionsCount(); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } m_pDimensionIDs = new GUID[m_nFrameDimensionsCount]; ZeroMemory(m_pDimensionIDs, sizeof(GUID) * m_nFrameDimensionsCount); // 获取每个维数对应的GUID m_pImage->GetFrameDimensionsList(m_pDimensionIDs, m_nFrameDimensionsCount); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } // Get the number of frames in the first dimension. m_nFrames = m_pImage->GetFrameCount(&m_pDimensionIDs[0]); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } m_nPropertysCount = m_pImage->GetPropertyCount(); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } m_pPropIDs = new PROPID[m_nPropertysCount]; ZeroMemory(m_pPropIDs, sizeof(PROPID) * m_nPropertysCount); m_pImage->GetPropertyIdList(m_nPropertysCount, m_pPropIDs); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } // 只有PROID为Ox5100中存放延时时间 int index; BOOL bFind = FALSE; for ( index = 0; index < (int)m_nPropertysCount; index++ ) { if ( m_pPropIDs[index] == PropertyTagFrameDelay ) { bFind = TRUE; break; } } if ( !bFind ) { FreeResource(); return FALSE; } m_nPropSize = m_pImage->GetPropertyItemSize(m_pPropIDs[index]); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } m_pPorertyItem = (PropertyItem*)malloc(m_nPropSize); ZeroMemory(m_pPorertyItem, m_nPropSize); m_pImage->GetPropertyItem(m_pPropIDs[index], m_nPropSize, m_pPorertyItem); if ( m_pImage->GetLastStatus() != Ok ) { FreeResource(); return FALSE; } if ( m_nFrames > 1 && m_hWnd && GetDelayTime(m_nCurrentFrame++, m_nDelayTime) ) { if ( m_bCustom ) m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_dwCustomDelayTime, NULL); else m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_nDelayTime, NULL); } CRect rect; GetWindowRect(rect);#if 0 SetWindowPos(NULL, rect.left, rect.top, m_szImage.cx, m_szImage.cy, SWP_NOMOVE); CRgn Rgn; Rgn.CreateRectRgn(0, 0, m_szImage.cx, m_szImage.cy); if ( Rgn.m_hObject) SetWindowRgn((HRGN)Rgn.GetSafeHandle(), FALSE);#else SetWindowPos(NULL, rect.left, rect.top, m_szImage.cx, m_szImage.cy, SWP_NOMOVE);#endif return TRUE;}void CGIFStaticControl::SetCustomDelayTime(DWORD dwMilliseconds){ m_dwCustomDelayTime = dwMilliseconds;}DWORD CGIFStaticControl::GetCustomDelayTime() const{ return m_dwCustomDelayTime;}void CGIFStaticControl::SetDelayTimeType(BOOL bCustom){ m_bCustom = bCustom;}BOOL CGIFStaticControl::IsUsedCustomDelayTime() const{ return m_bCustom;}BOOL CGIFStaticControl::GetDelayTime(UINT nFrameNumber, UINT& nDelayTime){ int nDelayTimeTemp; if ( !m_pPorertyItem ) return FALSE; if ( nFrameNumber < 0 || nFrameNumber >= m_nFrames ) return FALSE; nDelayTimeTemp = (UINT)(*(((UINT*)m_pPorertyItem->value) + nFrameNumber)); nDelayTimeTemp *= 10; if ( nDelayTimeTemp != 0 ) nDelayTime = nDelayTimeTemp; return TRUE;}void CGIFStaticControl::FreeResource(){ if ( m_pImage ) { delete m_pImage; m_pImage = NULL; } m_nFrameDimensionsCount = 0; if ( m_pDimensionIDs ) { delete [] m_pDimensionIDs; m_pDimensionIDs = NULL; } m_nPropertysCount = 0; if ( m_pPropIDs ) { delete [] m_pPropIDs; m_pPropIDs = NULL; } m_nPropSize = 0; if ( m_pPorertyItem ) { free(m_pPorertyItem); m_pPorertyItem = NULL; } if ( m_nTimer && m_hWnd ) { KillTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID); m_nTimer = 0; } if ( m_hMem ) { ::GlobalFree(m_hMem); m_hMem = NULL; } m_nCurrentFrame = 0; m_nFrames = 0; m_szImage = CSize(0, 0);}BEGIN_MESSAGE_MAP(CGIFStaticControl, CStatic)ON_WM_PAINT()ON_WM_TIMER()ON_WM_CREATE()ON_WM_DESTROY()ON_WM_ERASEBKGND()END_MESSAGE_MAP()void CGIFStaticControl::OnPaint(){ CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CStatic::OnPaint() for painting messages#if 1 Draw();#else Draw(&dc);#endif}void CGIFStaticControl::OnTimer(UINT_PTR nIDEvent){ if ( nIDEvent == MFCTK_GIF_STATIC_CONTROL_TIMER_ID ) { if ( m_bCustom ) SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_dwCustomDelayTime, NULL); else { if ( GetDelayTime(m_nCurrentFrame, m_nDelayTime) ) m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_nDelayTime, NULL); } Status status; if ( m_pImage && m_pDimensionIDs ) status = m_pImage->SelectActiveFrame(&m_pDimensionIDs[0], m_nCurrentFrame); Invalidate(); if ( m_nCurrentFrame < m_nFrames -1 ) m_nCurrentFrame++; else m_nCurrentFrame = 0; } CStatic::OnTimer(nIDEvent);}void CGIFStaticControl::Draw(){ if ( !m_hWnd ) return; if ( !m_pImage ) return; Graphics graphics(m_hWnd); // Create a GDI+ graphics object graphics.DrawImage(m_pImage, 0, 0);}void CGIFStaticControl::Draw(CDC* pDC){ CDC memDC; CBitmap bitmap, *pOldBitmap = NULL; if ( !memDC.CreateCompatibleDC(pDC) ) return; if ( !bitmap.CreateCompatibleBitmap(pDC, m_szImage.cx, m_szImage.cy) ) return; pOldBitmap = memDC.SelectObject(&bitmap); Graphics graphics(memDC.GetSafeHdc()); graphics.DrawImage(m_pImage, 0, 0); pDC->StretchBlt(0, 0, m_szImage.cx, m_szImage.cy, &memDC, 0, 0, m_szImage.cx, m_szImage.cy, SRCCOPY); memDC.SelectObject(pOldBitmap); memDC.DeleteDC();}int CGIFStaticControl::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CStatic::OnCreate(lpCreateStruct) == -1) return -1; return 0;}void CGIFStaticControl::OnDestroy(){ CStatic::OnDestroy(); FreeResource();}BOOL CGIFStaticControl::OnEraseBkgnd(CDC* pDC){ return TRUE; return CStatic::OnEraseBkgnd(pDC);} CPICTUREEX类刚试过了,要在顶层对话框才能实现动画,如果是非模态对话框就不动了呢。 http://wenku.baidu.com/view/7c00aa6f58fafab069dc021a.html 我的解决方法比较笨也比较容易懂,用某个软件吧gif分解成很多图片,另辟一个线程专门用于循环显示这些图片。 请问hahaking119BOOL CGIFStaticControl::LoadGIFImage(const CString& strImageFileName)中m_pImage = new Image(strImageFileName, FALSE);m_pImage总是空,我是在对话框的初始化方法里调用的 GetLastError看看返回值是什么? CPictureEx用了,但是在按钮事件函数中图像不动,一定要执行完按钮事件函数后图像才动起来,这个如何解决? 我用CPictureEx遇到了同样的问题,最后实在没办法,就在按钮事件函数中又开辟了一条新线程用于执行事件,主线程专用来显示动画了。期待高手告诉个简洁方法。 OpenGL, DirectX哪个好? 求教!怎样修改类的继承关系? VC设计内网桌面监控系统 键盘实现鼠标左键 如何让状态条显示自己的输出的字符串? SetWindowLong(hwnd, GWL_USERDATA, (LONG)this); 控制台程序里怎么使用CMSComm控件? 求助:一个关于在VC++6.0中调用SQLSERVER2000存储过程的问题(百分求助) 请问如何在程序中使用热键? 这个问题很难么?(enum)帮帮忙,兄弟 CMenu疑问 我定义了一个类变量 提示说“不允许使用不完整类型”是什么意思呢
#pragma once#include <gdiplus.h>
using namespace Gdiplus;class GdiPlusInstance
{
public:
GdiPlusInstance();
~GdiPlusInstance();
protected:
ULONG_PTR m_gdiplusToken;
GdiplusStartupInput m_input;
};class CGIFStaticControl : public CStatic
{
DECLARE_DYNCREATE(CGIFStaticControl)
public:
CGIFStaticControl(void);
~CGIFStaticControl(void);public:
/**
* 从文件加载
*/
BOOL LoadGIFImage(const CString& strImageFileName); /**
* 从资源加载
*/
BOOL LoadGIFImage(UINT nID); /**
* 自定义延时时间,单位毫秒
*/
void SetCustomDelayTime(DWORD dwMilliseconds); /**
* 获取自定义延时时间
*/
DWORD GetCustomDelayTime() const; /**
* 设置使用延时时间类型
*/
void SetDelayTimeType(BOOL bCustom); /**
* 是否使用用户自定义延时时间
*/
BOOL IsUsedCustomDelayTime() const;protected:
BOOL Init();
void Draw();
void Draw(CDC* pDC);
void FreeResource();
BOOL GetDelayTime(UINT nFrameNumber, UINT& nDelayTime);
protected:
// 安装GDI+
GdiPlusInstance m_Instance;
// 图像对象
Image* m_pImage;
// 图像大小
CSize m_szImage;
// 图像维数尺度GUID指针链表
GUID* m_pDimensionIDs;
// 尺度数量
UINT m_nFrameDimensionsCount;
// 图像帧个数
UINT m_nFrames;
// 当前播放的帧
UINT m_nCurrentFrame;
// 用于绘制图像的定时器
UINT_PTR m_nTimer;
// 元数据属性数量
UINT m_nPropertysCount;
// 元数据属性标识指针链表
PROPID* m_pPropIDs;
// 指定数据属性标识对应属性块大小
UINT m_nPropSize;
// 属性内容
PropertyItem* m_pPorertyItem;
// 延时时间
UINT m_nDelayTime;
// 用户自定应延时时间
DWORD m_dwCustomDelayTime;
// 使用延时时间类型
BOOL m_bCustom;
// 存储资源内存块
HGLOBAL m_hMem;
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
#include "StdAfx.h"
#include "GIFStaticControl.h"GdiPlusInstance::GdiPlusInstance()
{
GdiplusStartup(&m_gdiplusToken, &m_input, NULL);
}GdiPlusInstance::~GdiPlusInstance()
{
GdiplusShutdown(m_gdiplusToken);
}IMPLEMENT_DYNCREATE(CGIFStaticControl, CStatic)CGIFStaticControl::CGIFStaticControl(void)
{
m_nTimer = 0;
m_nFrames = 0;
m_nCurrentFrame = 0;
m_pImage = NULL;
m_hMem = NULL; m_nFrameDimensionsCount = 0;
m_pDimensionIDs = NULL; m_nPropertysCount = 0;
m_pPropIDs = NULL; m_nPropSize = 0;
m_pPorertyItem = NULL; m_nDelayTime = 100; m_bCustom = FALSE;
m_dwCustomDelayTime = 200;
}CGIFStaticControl::~CGIFStaticControl(void)
{
// FreeResource();
}BOOL CGIFStaticControl::LoadGIFImage(const CString& strImageFileName)
{
FreeResource(); m_pImage = new Image(strImageFileName, FALSE);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} return Init();
}BOOL CGIFStaticControl::LoadGIFImage(UINT nID)
{
FreeResource(); HINSTANCE hInstance = AfxGetInstanceHandle();
HRSRC hRsrc = ::FindResource(hInstance, MAKEINTRESOURCE(nID), _T("GIF"));
if (!hRsrc)
return FALSE; // load resource into memory
DWORD len = ::SizeofResource(hInstance, hRsrc);
BYTE* lpRsrc = (BYTE*)::LoadResource(hInstance, hRsrc);
if (!lpRsrc)
return FALSE; // Allocate global memory on which to create stream
m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
::CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream
m_pImage = Gdiplus::Image::FromStream(pstm); // free/release stuff
::GlobalUnlock(m_hMem);
pstm->Release();
::FreeResource(lpRsrc); return Init();
}BOOL CGIFStaticControl::Init()
{
if(!m_pImage)
return FALSE; m_szImage.cx = m_pImage->GetWidth();
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} m_szImage.cy = m_pImage->GetHeight();
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} // 获取帧维数
m_nFrameDimensionsCount = m_pImage->GetFrameDimensionsCount();
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} m_pDimensionIDs = new GUID[m_nFrameDimensionsCount];
ZeroMemory(m_pDimensionIDs, sizeof(GUID) * m_nFrameDimensionsCount); // 获取每个维数对应的GUID
m_pImage->GetFrameDimensionsList(m_pDimensionIDs, m_nFrameDimensionsCount);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} // Get the number of frames in the first dimension.
m_nFrames = m_pImage->GetFrameCount(&m_pDimensionIDs[0]);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} m_nPropertysCount = m_pImage->GetPropertyCount();
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} m_pPropIDs = new PROPID[m_nPropertysCount];
ZeroMemory(m_pPropIDs, sizeof(PROPID) * m_nPropertysCount); m_pImage->GetPropertyIdList(m_nPropertysCount, m_pPropIDs);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} // 只有PROID为Ox5100中存放延时时间
int index;
BOOL bFind = FALSE;
for ( index = 0; index < (int)m_nPropertysCount; index++ )
{
if ( m_pPropIDs[index] == PropertyTagFrameDelay )
{
bFind = TRUE;
break;
}
} if ( !bFind )
{
FreeResource();
return FALSE;
} m_nPropSize = m_pImage->GetPropertyItemSize(m_pPropIDs[index]);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
}
m_pPorertyItem = (PropertyItem*)malloc(m_nPropSize);
ZeroMemory(m_pPorertyItem, m_nPropSize);
m_pImage->GetPropertyItem(m_pPropIDs[index], m_nPropSize, m_pPorertyItem);
if ( m_pImage->GetLastStatus() != Ok )
{
FreeResource();
return FALSE;
} if ( m_nFrames > 1 && m_hWnd && GetDelayTime(m_nCurrentFrame++, m_nDelayTime) )
{
if ( m_bCustom )
m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_dwCustomDelayTime, NULL);
else
m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_nDelayTime, NULL);
} CRect rect;
GetWindowRect(rect);
#if 0
SetWindowPos(NULL, rect.left, rect.top, m_szImage.cx, m_szImage.cy, SWP_NOMOVE);
CRgn Rgn;
Rgn.CreateRectRgn(0, 0, m_szImage.cx, m_szImage.cy);
if ( Rgn.m_hObject)
SetWindowRgn((HRGN)Rgn.GetSafeHandle(), FALSE);
#else
SetWindowPos(NULL, rect.left, rect.top, m_szImage.cx, m_szImage.cy, SWP_NOMOVE);
#endif return TRUE;
}void CGIFStaticControl::SetCustomDelayTime(DWORD dwMilliseconds)
{
m_dwCustomDelayTime = dwMilliseconds;
}DWORD CGIFStaticControl::GetCustomDelayTime() const
{
return m_dwCustomDelayTime;
}void CGIFStaticControl::SetDelayTimeType(BOOL bCustom)
{
m_bCustom = bCustom;
}BOOL CGIFStaticControl::IsUsedCustomDelayTime() const
{
return m_bCustom;
}BOOL CGIFStaticControl::GetDelayTime(UINT nFrameNumber, UINT& nDelayTime)
{
int nDelayTimeTemp;
if ( !m_pPorertyItem )
return FALSE; if ( nFrameNumber < 0 || nFrameNumber >= m_nFrames )
return FALSE; nDelayTimeTemp = (UINT)(*(((UINT*)m_pPorertyItem->value) + nFrameNumber));
nDelayTimeTemp *= 10; if ( nDelayTimeTemp != 0 )
nDelayTime = nDelayTimeTemp; return TRUE;
}void CGIFStaticControl::FreeResource()
{
if ( m_pImage )
{
delete m_pImage;
m_pImage = NULL;
} m_nFrameDimensionsCount = 0;
if ( m_pDimensionIDs )
{
delete [] m_pDimensionIDs;
m_pDimensionIDs = NULL;
} m_nPropertysCount = 0;
if ( m_pPropIDs )
{
delete [] m_pPropIDs;
m_pPropIDs = NULL;
} m_nPropSize = 0;
if ( m_pPorertyItem )
{
free(m_pPorertyItem);
m_pPorertyItem = NULL;
} if ( m_nTimer && m_hWnd )
{
KillTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID);
m_nTimer = 0;
} if ( m_hMem )
{
::GlobalFree(m_hMem);
m_hMem = NULL;
}
m_nCurrentFrame = 0;
m_nFrames = 0;
m_szImage = CSize(0, 0);
}BEGIN_MESSAGE_MAP(CGIFStaticControl, CStatic)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()void CGIFStaticControl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CStatic::OnPaint() for painting messages
#if 1
Draw();
#else
Draw(&dc);
#endif
}void CGIFStaticControl::OnTimer(UINT_PTR nIDEvent)
{
if ( nIDEvent == MFCTK_GIF_STATIC_CONTROL_TIMER_ID )
{
if ( m_bCustom )
SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_dwCustomDelayTime, NULL);
else
{
if ( GetDelayTime(m_nCurrentFrame, m_nDelayTime) )
m_nTimer = SetTimer(MFCTK_GIF_STATIC_CONTROL_TIMER_ID, m_nDelayTime, NULL);
}
Status status;
if ( m_pImage && m_pDimensionIDs )
status = m_pImage->SelectActiveFrame(&m_pDimensionIDs[0], m_nCurrentFrame); Invalidate(); if ( m_nCurrentFrame < m_nFrames -1 )
m_nCurrentFrame++;
else
m_nCurrentFrame = 0;
} CStatic::OnTimer(nIDEvent);
}void CGIFStaticControl::Draw()
{
if ( !m_hWnd )
return; if ( !m_pImage )
return; Graphics graphics(m_hWnd); // Create a GDI+ graphics object
graphics.DrawImage(m_pImage, 0, 0);
}void CGIFStaticControl::Draw(CDC* pDC)
{
CDC memDC;
CBitmap bitmap, *pOldBitmap = NULL;
if ( !memDC.CreateCompatibleDC(pDC) )
return; if ( !bitmap.CreateCompatibleBitmap(pDC, m_szImage.cx, m_szImage.cy) )
return; pOldBitmap = memDC.SelectObject(&bitmap); Graphics graphics(memDC.GetSafeHdc());
graphics.DrawImage(m_pImage, 0, 0); pDC->StretchBlt(0, 0, m_szImage.cx, m_szImage.cy, &memDC, 0, 0, m_szImage.cx, m_szImage.cy, SRCCOPY); memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}int CGIFStaticControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatic::OnCreate(lpCreateStruct) == -1)
return -1; return 0;
}void CGIFStaticControl::OnDestroy()
{
CStatic::OnDestroy(); FreeResource();
}BOOL CGIFStaticControl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
return CStatic::OnEraseBkgnd(pDC);
}
BOOL CGIFStaticControl::LoadGIFImage(const CString& strImageFileName)中
m_pImage = new Image(strImageFileName, FALSE);
m_pImage总是空,我是在对话框的初始化方法里调用的