2007-03-27 17:47:10 +00:00
|
|
|
// ImageDataObject.h: Impementation for IDataObject Interface to be used
|
2014-11-04 00:26:53 +00:00
|
|
|
// in inserting bitmap to the RichEdit Control.
|
2007-03-27 17:47:10 +00:00
|
|
|
//
|
|
|
|
// Author : Hani Atassi (atassi@arabteam2000.com)
|
|
|
|
//
|
|
|
|
// How to use : Just call the static member InsertBitmap with
|
2014-11-04 00:26:53 +00:00
|
|
|
// the appropriate parrameters.
|
2007-03-27 17:47:10 +00:00
|
|
|
//
|
|
|
|
// Known bugs :
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#if !defined(AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_)
|
|
|
|
#define AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_
|
|
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
|
|
#pragma once
|
|
|
|
#endif // _MSC_VER > 1000
|
|
|
|
|
|
|
|
#include <afxole.h>
|
|
|
|
#include <richole.h>
|
|
|
|
|
|
|
|
class CImageDataObject : IDataObject
|
|
|
|
{
|
|
|
|
public:
|
2014-11-04 00:26:53 +00:00
|
|
|
// This static fumction accepts those parameters:
|
|
|
|
// IRichEditOle* : a pointer to IRochEditOle interface for the RichEdit Control
|
|
|
|
// HBITMAP : the bitmap handle.
|
|
|
|
//
|
|
|
|
// After calling the function, it inserts the image in the current
|
|
|
|
// position of the RichEdit
|
|
|
|
//
|
|
|
|
static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap);
|
2007-03-27 17:47:10 +00:00
|
|
|
|
|
|
|
private:
|
2014-11-04 00:26:53 +00:00
|
|
|
ULONG m_ulRefCnt;
|
|
|
|
BOOL m_bRelease;
|
2007-03-27 17:47:10 +00:00
|
|
|
|
2014-11-04 00:26:53 +00:00
|
|
|
// The data being bassed to the richedit
|
|
|
|
//
|
|
|
|
STGMEDIUM m_stgmed;
|
|
|
|
FORMATETC m_fromat;
|
2007-03-27 17:47:10 +00:00
|
|
|
|
|
|
|
public:
|
2014-11-04 00:26:53 +00:00
|
|
|
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;
|
2014-11-19 22:54:24 +00:00
|
|
|
return 0;
|
2014-11-04 00:26:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage);
|
2007-03-27 17:47:10 +00:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // !defined(AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_)
|