GIF in RicheditOle



  • Hi

    also ich habs jetzt endlich hinbekommen ein BMP in mein Richeditole zu bringen!!! Jetzt will ich aber, dass da ein animiertes Gif erscheint!
    Ich benutze dazu TGifImage, von der torry seite! Aber bekomme immer Fehler!
    Hier mal der alte Code, wie würdet ihr das machen?

    pRichEditOle = NULL;
            ::SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);
    hBitmap = (HBITMAP) LoadImage(NULL, TEXT(Edit1->Text.c_str()), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    CImageDataObject::InsertBitmap(pRichEditOle, hBitmap);
    
    und jetzt die Insert bitmap methode!!!!!
    class CImageDataObject : IDataObject
    {
    public:
        // This static function accepts a pointer to IRochEditOle
        //   and the bitmap handle.
        // After that the function insert the image in the current
        //   position of the RichEdit
        //
        static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP *hBitmap)
        {
            SCODE sc;
    
            // Get the image data object
            //
            CImageDataObject *pods = new CImageDataObject;
            LPDATAOBJECT lpDataObject;
            pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject);
    
            pods->SetBitmap(hBitmap);
    
            // Get the RichEdit container site
            //
            IOleClientSite *pOleClientSite;
            pRichEditOle->GetClientSite(&pOleClientSite);
    
            // Initialize a Storage Object
            //
            IStorage *pStorage;
    
            LPLOCKBYTES lpLockBytes = NULL;
            sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    
            sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
                STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
            if (sc != S_OK)
            {
                lpLockBytes = NULL;
            }
    
            // The final ole object which will be inserted in the richedit control
            //
            IOleObject *pOleObject;
            pOleObject = pods->GetOleObject(pOleClientSite, pStorage);
    
            // all items are "contained" -- this makes our reference to this object
            //  weak -- which is needed for links to embedding silent update.
            OleSetContainedObject(pOleObject, TRUE);
    
            // Now Add the object to the RichEdit
            //
            REOBJECT reobject;
            ZeroMemory(&reobject, sizeof(REOBJECT));
            reobject.cbStruct = sizeof(REOBJECT);
    
            CLSID clsid;
            sc = pOleObject->GetUserClassID(&clsid);
    
            reobject.clsid = clsid;
            reobject.cp = REO_CP_SELECTION;
            reobject.dvaspect = DVASPECT_CONTENT;
            reobject.poleobj = pOleObject;
            reobject.polesite = pOleClientSite;
            reobject.pstg = pStorage;
    
            // Insert the bitmap at the current location in the richedit control
            //
            pRichEditOle->InsertObject(&reobject);
    
            // Release all unnecessary interfaces
            //
            pOleObject->Release();
            pOleClientSite->Release();
            pStorage->Release();
            lpDataObject->Release();
        }
    private:
        ULONG m_ulRefCnt;
        BOOL  m_bRelease;
    
        // The data being bassed to the richedit
        //
        STGMEDIUM m_stgmed;
        FORMATETC m_fromat;
    
    public:
        CImageDataObject() : m_ulRefCnt(0) {
            m_bRelease = FALSE;
        }
    
        ~CImageDataObject() {
            if (m_bRelease)
                ::ReleaseStgMedium(&m_stgmed);
        }
    
        // Methods of the IUnknown interface
        //
        STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
        {
            if (iid == IID_IUnknown || iid == IID_IDataObject)
            {
                *ppvObject = this;
                AddRef();
                return S_OK;
            }
            else
                return E_NOINTERFACE;
        }
        STDMETHOD_(ULONG, AddRef)(void)
        {
            m_ulRefCnt++;
            return m_ulRefCnt;
        }
        STDMETHOD_(ULONG, Release)(void)
        {
            if (--m_ulRefCnt == 0)
            {
                delete this;
            }
    
            return m_ulRefCnt;
        }
    
        // Methods of the IDataObject Interface
        //
        STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
        {
            HANDLE hDst;
            hDst = ::OleDuplicateData(m_stgmed.hBitmap,
                CF_BITMAP, NULL);
            if (hDst == NULL)
            {
                return E_HANDLE;
            }
           pmedium->tymed = TYMED_GDI;
            pmedium->hBitmap = (HBITMAP)hDst;
            pmedium->pUnkForRelease = NULL;
    
            return S_OK;
        }
        STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium)
        {
            return E_NOTIMPL;
        }
        STDMETHOD(QueryGetData)(FORMATETC*  pformatetc )
        {
            return E_NOTIMPL;
        }
        STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn, FORMATETC* pformatetcOut)
        {
            return E_NOTIMPL;
        }
        STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease)
        {
            m_fromat = *pformatetc;
            m_stgmed = *pmedium;
    
            return S_OK;
        }
        STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc)
        {
            return E_NOTIMPL;
        }
        STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
        {
            return E_NOTIMPL;
        }
        STDMETHOD(DUnadvise)(DWORD dwConnection)
        {
            return E_NOTIMPL;
        }
        STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise)
        {
            return E_NOTIMPL;
        }
    
        // Some Other helper functions
        //
        void SetBitmap(HBITMAP *hBitmap)
        {
            STGMEDIUM stgm;
            stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle
            stgm.hBitmap = hBitmap;
            stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium
    
            FORMATETC fm;
            fm.cfFormat = CF_BITMAP;                // Clipboard format = CF_BITMAP
            fm.ptd = NULL;                            // Target Device = Screen
            fm.dwAspect = DVASPECT_CONTENT;            // Level of detail = Full content
            fm.lindex = -1;                            // Index = Not applicaple
            fm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle
    
            this->SetData(&fm, &stgm, TRUE);
        }
    
        IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)
        {
            SCODE sc;
            IOleObject *pOleObject;
            sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
                &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject);
            return pOleObject;
        }
    };
    

    Wenn ich einfach die HBITMAP durch TGIFImage ersetze bekomme ich bei sc = pOleObject->GetUserClassID(&clsid); eine Zugriffsverletzung bei adresse 000000

    KANN MIR JEMAND HELFEN?
    ICH PEIL JETZT NULL MEHR

    WinPy



  • lol? keiner ne ahnung?



  • hallo?



  • 1. ich bezweifle dass jemand den ganzen code durchschaut und durchdenkt
    2. ich bezweifle dass jemand dir bei deinem fehler helfen kann, wenn du nicht mindestens die fehlermeldung preis gibst


Anmelden zum Antworten