//impelement a IRichEditOleCallback interface and register it with
the
CRichEditCtrl using SetOLECallback() function. The code for a minimal
implementation of IRichEditOleCallback is below:
from the dialogs Header file:
class CRichEditOleCallback : public IRichEditOleCallback
{
public:
STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * lplpObj);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();
STDMETHOD (GetNewStorage) (LPSTORAGE FAR * lplpstg);
STDMETHOD (GetInPlaceContext) (LPOLEINPLACEFRAME FAR * lplpFrame,
LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHOD (ShowContainerUI) (BOOL fShow);
STDMETHOD (QueryInsertObject) (LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
STDMETHOD (DeleteObject) (LPOLEOBJECT lpoleobj);
STDMETHOD (QueryAcceptData) (LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *
lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
STDMETHOD (ContextSensitiveHelp) (BOOL fEnterMode);
STDMETHOD (GetClipboardData) (CHARRANGE FAR * lpchrg, DWORD reco,
LPDATAOBJECT
FAR * lplpdataobj);
STDMETHOD (GetDragDropEffect) (BOOL fDrag, DWORD grfKeyState, LPDWORD
pdwEffect);
STDMETHOD (GetContextMenu) (WORD seltype, LPOLEOBJECT lpoleobj,CHARRANGE
FAR *
lpchrg, HMENU FAR * lphmenu);
STDMETHODIMP CRichEditOleCallback::GetNewStorage(LPSTORAGE FAR * lplpstg)
{
// Create a flat storage and steal it from the client item
// the client item is only used for creating the storage
COleClientItem item;
item.GetItemStorageFlat();
*lplpstg = item.m_lpStorage;
HRESULT hRes = E_OUTOFMEMORY;
if (item.m_lpStorage != NULL)
{
item.m_lpStorage = NULL;
hRes = S_OK;
}
return hRes;
}
STDMETHODIMP CRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR *
lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO
lpFrameInfo)
{
return E_NOTIMPL;
}
STDMETHODIMP CRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj,
CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict)
{
// implement checks in code here, for example is the format acceptable
// user back pointer to CRichEditCtrl (above) to execute certain routines
// return S_OK if everthing is OK else return E_FAIL
return E_NOTIMPL;
}
STDMETHODIMP CRichEditOleCallback::GetContextMenu(WORD seltype, LPOLEOBJECT
lpoleobj,CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu)
{
return E_NOTIMPL;
}
/////////////////////////////////////////////////
BOOL CPasteBitmapToRichEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
.
.
.
BOOL bSuccess = m_RichEditCtrl.SetOLECallback(&m_RichEditOleCallback);
.
.
.
}
Have a look at the official sample in Q141549