VC picture上怎么显示gif文件,并让它实时播放.

解决方案 »

  1.   

    使用GDI+来播放GIF
      

  2.   

    IPicture 是可以的,一下是我封装的一个类,你自己看看吧头文件:
    // Picture.h: interface for the CPicture class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_)
    #define AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#include "olectl.h"class CPicture  
    {
    public:
    CPicture();
    virtual ~CPicture(); bool Load(CString sFileName, int cxDesired, int cyDesired);
    CSize GetSize(CDC* pDC);
    HBITMAP GetHBmp();
    void DeleteHBmp();
    private:
    static bool GetResource(LPSTR lpName, LPSTR lpType, void* pResource, int& nBufSize);
    void UnLoad();
    bool LoadFromBuffer(BYTE* pBuff, int nSize,
    int cxDesired, int cyDesired);
    IPicture* m_pPicture;
    enum
    {
    HIMETRIC_INCH = 2540
    };  HBITMAP hBB;
    };#endif // !defined(AFX_PICTURE_H__6098A4C3_D6D5_4711_BC7B_1595F459B480__INCLUDED_)
      

  3.   

    CPP 文件// Picture.cpp: implementation of the CPicture class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "Picture.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CPicture::CPicture()
    {
    hBB = NULL;
    m_pPicture = NULL;
    }CPicture::~CPicture()
    {
    UnLoad();
    }bool CPicture::Load(CString sFileName, int cxDesired, int cyDesired)
    {
    bool bResult = false; if (m_pPicture != NULL)
    UnLoad(); if (m_pPicture == NULL)
    {
    CFile cFile;
    CFileException e; if (cFile.Open(sFileName, CFile::modeRead | CFile::typeBinary, &e))
    {
    BYTE* pBuff = new BYTE[cFile.GetLength()]; if (cFile.Read(pBuff, cFile.GetLength()) > 0)
    {
    if (LoadFromBuffer(pBuff, cFile.GetLength(),
    cxDesired, cyDesired))
    bResult = true;
    } delete [] pBuff;
    }
    } return bResult;
    }void CPicture::UnLoad()
    {
    long l; if (m_pPicture != NULL)
    {
    l = m_pPicture->Release();
    m_pPicture = NULL;
    }
    }bool CPicture::LoadFromBuffer(BYTE* pBuff, 
      int nSize,
      int cxDesired,
      int cyDesired)
    {
    bool bResult = false; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);
    void* pData = GlobalLock(hGlobal);
    memcpy(pData, pBuff, nSize);
    GlobalUnlock(hGlobal); IStream* pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
    {
    HRESULT hr;
    if ((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture)) == S_OK)
    {
    bResult = true;
    }

    HBITMAP hB = 0;
        m_pPicture->get_Handle((unsigned int*)&hB);     // Copy the image. Necessary, because upon p's release,
        // the handle is destroyed. if (hBB != NULL)
    {
    DeleteObject(hBB);
    hBB = NULL;
    } hBB = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,cxDesired,cyDesired,
    LR_COPYDELETEORG); DeleteObject(hB);
    hB = NULL; pStream->Release();
    } return bResult;
    }bool CPicture::GetResource(LPSTR lpName, LPSTR lpType, void* pResource, int& nBufSize)

    HRSRC hResInfo;
    HANDLE hRes;
    HMODULE hInst = NULL;
    LPSTR lpRes = NULL;
    int nLen = 0;
    bool bResult = FALSE; // Find the resource
    hResInfo = FindResource(hInst, lpName, lpType); if (hResInfo == NULL) 
    return false; // Load the resource
    hRes = LoadResource(hInst, hResInfo); if (hRes == NULL) 
    return false; // Lock the resource
    lpRes = (char*)LockResource(hRes); if (lpRes != NULL)

    if (pResource == NULL)
    {
    nBufSize = SizeofResource(hInst, hResInfo);
    bResult = true;
    }
    else
    {
    if (nBufSize >= (int)SizeofResource(hInst, hResInfo))
    {
    memcpy(pResource, lpRes, nBufSize);
    bResult = true;
    }
    } UnlockResource(hRes);
    } // Free the resource
    FreeResource(hRes); return bResult;
    }CSize CPicture::GetSize(CDC* pDC)
    {
    CSize rcResult = CSize(0,0);

    if (m_pPicture != NULL)
    {
    long hmWidth;
    long hmHeight;
    m_pPicture->get_Width(&hmWidth);
    m_pPicture->get_Height(&hmHeight); if (pDC==NULL)
    {
    CWindowDC dc(NULL);
    dc.HIMETRICtoDP(&rcResult); // convert to pixels
    }
    else
    {
    rcResult.cx = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), HIMETRIC_INCH);
    rcResult.cy = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), HIMETRIC_INCH);
    }
    } return rcResult;
    }HBITMAP CPicture::GetHBmp()
    {
    return hBB;
    }void CPicture::DeleteHBmp()
    {
    DeleteObject(hBB);
    hBB = NULL;
    }
      

  4.   

    抱歉,我提供的这个方法不能播放多帧的GIF, 你参考以下链接的代码吧
    http://www.codeproject.com/KB/graphics/pictureex.aspx
      

  5.   

    看这里,有详细说明:
    http://www.vckbase.com/vckbase/default.aspx