用了那个CExplorer1控件,但是没见效,很不明白怎么用,说是用CWebBrowser2,可是右键点击插入ActiveX控件、怎么VC2008没有找到这个WebBrowser控件?请高手指点!

解决方案 »

  1.   

    找一些网上的能显示GIF的ActiveX控件吧。应该有很多
      

  2.   

    GOOGLE CPictureEx 或 ImageEx
      

  3.   

    使用 CHtmlView,直接用HTML显示
      

  4.   

    强烈推荐CPICTUREEX类,使用很方便。
      

  5.   

    自己用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);
    };
      

  6.   

    // .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);
    }
      

  7.   

    CPICTUREEX类刚试过了,要在顶层对话框才能实现动画,如果是非模态对话框就不动了呢。
      

  8.   

    http://wenku.baidu.com/view/7c00aa6f58fafab069dc021a.html
      

  9.   

    我的解决方法比较笨也比较容易懂,用某个软件吧gif分解成很多图片,另辟一个线程专门用于循环显示这些图片。
      

  10.   

    请问hahaking119
    BOOL CGIFStaticControl::LoadGIFImage(const CString& strImageFileName)中
    m_pImage = new Image(strImageFileName, FALSE);
    m_pImage总是空,我是在对话框的初始化方法里调用的
      

  11.   

    GetLastError看看返回值是什么?
      

  12.   

    CPictureEx用了,但是在按钮事件函数中图像不动,一定要执行完按钮事件函数后图像才动起来,这个如何解决?
      

  13.   

    我用CPictureEx遇到了同样的问题,最后实在没办法,就在按钮事件函数中又开辟了一条新线程用于执行事件,主线程专用来显示动画了。期待高手告诉个简洁方法。