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 MEHRWinPy
-
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