急!!如何在richedit中插入gif格式的图片?是gif图

解决方案 »

  1.   

    http://dev.csdn.net/develop/article/56/56587.shtm
      

  2.   

    用qq的ImageOle.dll// MyRichEdit.cpp : implementation file
    //#include "stdafx.h"
    #include "ZJP.h"
    #include "MyRichEdit.h"
    #include "Richole.h"#import "E:\\Program files\\tencent\\qq\\ImageOle.dll" named_guids#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CMyRichEditCMyRichEdit::CMyRichEdit()
    {
    }CMyRichEdit::~CMyRichEdit()
    {
    }
    BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
    //{{AFX_MSG_MAP(CMyRichEdit)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /////////////////////////////////////////////////////////////////////////////
    // CMyRichEdit message handlersvoid CMyRichEdit::InsertGraphics(CString strPicPath)
    {
    LPLOCKBYTES lpLockBytes = NULL;
    SCODE sc;
    HRESULT hr;     
    //print to RichEdit' s IClientSite
    LPOLECLIENTSITE m_lpClientSite;
    //A smart point to IAnimator
    ImageOleLib::IGifAnimatorPtr m_lpAnimator;
    //ptr 2 storage     
    LPSTORAGE m_lpStorage;
    //the object 2 b insert 2
    LPOLEOBJECT m_lpObject;
    //Create lockbytes
        sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (sc != S_OK)
    AfxThrowOleException(sc);
    ASSERT(lpLockBytes != NULL);
    //use lockbytes to create storage
    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
    if (sc != S_OK)
    {
    VERIFY(lpLockBytes->Release() == 0);
    lpLockBytes = NULL;
    AfxThrowOleException(sc);
    }
    ASSERT(m_lpStorage != NULL);
    //get the ClientSite of the very RichEditCtrl
    GetIRichEditOle()->GetClientSite(&m_lpClientSite);
    ASSERT(m_lpClientSite != NULL);
    try
        {
    //Initlize COM interface

    hr = ::CoInitialize(NULL) ;//( NULL, COINIT_APARTMENTTHREADED );
    if( FAILED(hr) )
    _com_issue_error(hr);

    //Get GifAnimator object
    //here, I used a smart point, so I do not need to free it
    hr = m_lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
    if( FAILED(hr) )
    _com_issue_error(hr);
    //COM operation need BSTR, so get a BSTR
    BSTR path = strPicPath.AllocSysString(); //Load the gif
    hr = m_lpAnimator->LoadFromFile(path);
    if( FAILED(hr) )
    _com_issue_error(hr);

    TRACE0( m_lpAnimator->GetFilePath() );

    //get the IOleObject
    hr = m_lpAnimator.QueryInterface(IID_IOleObject, (void**)&m_lpObject);
    if( FAILED(hr) )
    _com_issue_error(hr);

    //Set it 2 b inserted
    OleSetContainedObject(m_lpObject, TRUE);

    //2 insert in 2 richedit, you need a struct of REOBJECT
    REOBJECT reobject;
    ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT);
    CLSID clsid;
    sc = m_lpObject->GetUserClassID(&clsid);
    if (sc != S_OK)
    AfxThrowOleException(sc);
    //set clsid
    reobject.clsid = clsid;
    //can be selected
    reobject.cp = REO_CP_SELECTION;
    //content, but not static
    reobject.dvaspect = DVASPECT_CONTENT;
    //goes in the same line of text line
    reobject.dwFlags = REO_BELOWBASELINE; //REO_RESIZABLE |
    reobject.dwUser = 0;
    //the very object
    reobject.poleobj = m_lpObject;
    //client site contain the object
    reobject.polesite = m_lpClientSite;
    //the storage 
    reobject.pstg = m_lpStorage;

    SIZEL sizel;
    sizel.cx = sizel.cy = 0;
    reobject.sizel = sizel;
    HWND hWndRT = this->m_hWnd;
    //Sel all text
    // ::SendMessage(hWndRT, EM_SETSEL, 0, -1);
    // DWORD dwStart, dwEnd;
    // ::SendMessage(hWndRT, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
    // ::SendMessage(hWndRT, EM_SETSEL, dwEnd+1, dwEnd+1);
    //Insert after the line of text
    GetIRichEditOle()->InsertObject(&reobject);
    ::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
    VARIANT_BOOL ret;
    //do frame changing
    ret = m_lpAnimator->TriggerFrameChange();
    //show it
    m_lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, m_lpClientSite, 0, m_hWnd, NULL);
    m_lpObject->DoVerb(OLEIVERB_SHOW, NULL, m_lpClientSite, 0, m_hWnd, NULL);

    //redraw the window to show animation
    RedrawWindow(); if (m_lpClientSite)
    {
    m_lpClientSite->Release();
    m_lpClientSite = NULL;
    }
    if (m_lpObject)
    {
    m_lpObject->Release();
    m_lpObject = NULL;
    }
    if (m_lpStorage)
    {
    m_lpStorage->Release();
    m_lpStorage = NULL;
    }

    SysFreeString(path);
    }
    catch( _com_error e )
    {
    AfxMessageBox(e.ErrorMessage());
    ::CoUninitialize();
    }
    }
      

  3.   

    To onestation(新手) 
    代码是不是不全呀
    怎么编译不通过 ?
    能给我发一份完整的代码吗?
    [email protected]
    谢谢
      

  4.   

    呵呵,这个是我审核的,测试过的,没问题.
    1.保证你正确的安装了QQ,应为他要一个DLL,更改路径#import "E:\\Program files\\tencent\\qq\\ImageOle.dll" named_guids 为你QQ的安装目录2.在你的InitInstance里面加上 AfxOleInit();AfxInitRichEdit();