找了点相关资料,看很多人都是用到QQ的imageole.dll,但我基础不是很好,有会的请祥细帮下

解决方案 »

  1.   

    这个得写一个控件插入richedit中的.imageole.dll是QQ写好的控件
      

  2.   

    是不是要重写richedit类?重写的时候要用到imageole
      

  3.   

    richedit不需要重写,写控件就可以了。如果使用imageole的话连控件都不用写。
      

  4.   

    就按楼上所说的,在RichEdit中直接嵌入一个OLE对象,用这个OLE对象来显示gif动画。
      

  5.   

    要怎么嵌入,还有OLE和GIF动画要怎么建立关系,他们的关系是怎么样的..这些我不太明白喔
      

  6.   

    帮你找到如下代码,使用之前要通过#import语句导入imageole的类型库:void UnmanagedInsertGif(int hwndRichEdit,wchar_t * pFilePath)
    {
    HWND h=(HWND)hwndRichEdit;

    LPRICHEDITOLE lpRichEditOle=NULL;
    LPOLEOBJECT lpObject=NULL;
    LPSTORAGE       lpStorage=NULL;
    LPOLECLIENTSITE lpClientSite=NULL;
    LPLOCKBYTES lpLockBytes = NULL; REOBJECT reobject;
    ZeroMemory(&reobject, sizeof(REOBJECT));
    reobject.cbStruct = sizeof(REOBJECT); HRESULT hr=S_OK;
    CLSID clsid=CLSID_NULL;
    do{
    ::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle);
    if(lpRichEditOle==NULL)break;
    hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (hr != S_OK||lpLockBytes==NULL) break;
    hr= ::StgCreateDocfileOnILockBytes(lpLockBytes,
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
    if (hr!= S_OK||lpStorage==NULL) break;
    hr=lpRichEditOle->GetClientSite(&lpClientSite);
    if (hr!= S_OK||lpClientSite==NULL) break;
    try
    {
    ImageOleLib::IGifAnimatorPtr lpAnimator;
    hr = lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
    if( FAILED(hr) ) _com_issue_error(hr);
    _bstr_t bstrPath(pFilePath);
    hr = lpAnimator->LoadFromFile(bstrPath);
    if( FAILED(hr) ) _com_issue_error(hr);
    hr = lpAnimator.QueryInterface(IID_IOleObject, (void**)&lpObject);
    if( FAILED(hr)||lpObject==NULL) _com_issue_error(hr);
    hr=OleSetContainedObject(lpObject, TRUE);
    if( FAILED(hr) ) _com_issue_error(hr);
    hr=lpObject->GetUserClassID(&clsid);
    if( FAILED(hr) ) _com_issue_error(hr);
    reobject.clsid = clsid;
    reobject.cp = REO_CP_SELECTION;
    reobject.dvaspect = DVASPECT_CONTENT;
    reobject.dwFlags = REO_BELOWBASELINE;
    reobject.dwUser = 0;
    reobject.poleobj = lpObject;
    reobject.polesite = lpClientSite;
    reobject.pstg = lpStorage;
    SIZEL sizel={0,0};
    reobject.sizel = sizel;
    hr=lpRichEditOle->InsertObject(&reobject);
    }
    catch( _com_error e )
    {
    LPCTSTR lpszErrMessage=e.ErrorMessage();
    } }while(FALSE);
    if(lpLockBytes)
    lpObject->Release();
    if(lpLockBytes)
    lpLockBytes->Release();
    if(lpClientSite)
    lpClientSite->Release();
    if(lpRichEditOle)
    lpRichEditOle->Release();
    }
    void UnmanagedGifTriggerFrameChange(int hwndRichEdit)
    {
    HWND h=(HWND)hwndRichEdit;

    LPRICHEDITOLE lpRichEditOle=NULL;
    LPOLECLIENTSITE lpClientSite=NULL;
    LPOLECONTAINER lpContainer=NULL;
    LPENUMUNKNOWN lpEnumUnknown=NULL;
    HRESULT hr=S_OK;
    do{
    ::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle);
    if(lpRichEditOle==NULL)break;
    hr=lpRichEditOle->GetClientSite(&lpClientSite);
    if (hr!= S_OK||lpClientSite==NULL) break;
    hr=lpClientSite->GetContainer(&lpContainer);
    if (hr!= S_OK||lpClientSite==NULL) break;
    hr=lpContainer->EnumObjects(OLECONTF_EMBEDDINGS,&lpEnumUnknown);
    if (hr!= S_OK||lpEnumUnknown==NULL) break; IUnknown* pUnk=NULL;
    ULONG uFetched=0;
    for (UINT i = 0; S_OK == lpEnumUnknown->Next(1, &pUnk, &uFetched); i++)
    {
    ImageOleLib::IGifAnimator* pAnimator=NULL;
    do{
    hr=pUnk->QueryInterface(__uuidof(ImageOleLib::IGifAnimator),(LPVOID*)&pAnimator);
    if (hr!= S_OK) break;
    try{
    ImageOleLib::IGifAnimatorPtr lpAnimator;
    lpAnimator.Attach(pAnimator,true);
    lpAnimator->TriggerFrameChange();
    }
    catch( _com_error e )
    {
    LPCTSTR lpszErrMessage=e.ErrorMessage();
    }
    }
    while(FALSE);
    pUnk->Release();
    if(pAnimator)
    pAnimator->Release();
    }
    }while(FALSE);
    if(lpEnumUnknown)
    lpEnumUnknown->Release();
    if(lpContainer)
    lpContainer->Release();
    if(lpRichEditOle)
    lpRichEditOle->Release();
    if(lpClientSite)
    lpClientSite->Release();
    }