RichEdit对ole 的相关支持总结
1. RichEdit要嵌入ole objects必须要继承 IRichEditOleCallback 接口,这个接口让richEdit能够增加RichEdit对Ole的嵌入支持。
首先在RichEdit的OnCreate中调用SetOLECallback函数,这样就设置了IRichEditOleCallback的接口实现者。
在OnCreate中,还要记得注册 ole剪贴板格式,这个格式是我们自己定的,在处理复制和粘贴的时候,需要用到它。
- //注册自己的ole 剪贴板格式
- #define STR_OWN_OLE_CLIPBOARD_FORMAT _T("STR_OWN_OLE_CLIPBOARD_FORMAT")
- m_uOwnOleClipboardFormat = RegisterClipboardFormat(STR_OWN_OLE_CLIPBOARD_FORMAT);
这个接口的几个必须实现的接口函数:
它为一个来自剪贴板粘贴的对象提供新的存储。
- STDMETHODIMP CRichEditCtrlEx::GetNewStorage(THIS_ 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;
- }
(2)QueryInsertObject
它处理来自ole object的插入请求,如果同意插入,就返回S_OK,否则返回E_NOTIMPL
在这个里面可以判断是否是自己需要的类型,如果不是,就可以拒绝插入。
- STDMETHODIMP CRichEditCtrlEx::QueryInsertObject(THIS_ LPCLSID lpclsid, LPSTORAGE lpstg,LONG cp)
- {
- if(CLSID_DynamicGif == *lpclsid)
- {
- //如果是CLSID_DynamicGif类型的嵌入对象,则支持,否则不支持
- return S_OK; //此语句用来显示一个嵌入对象
- }
- else
- {
- //否则
- return E_NOTIMPL;
- }
- }
(3) DeleteObject
它处理删除ole obj的请求,直接返回E_NOTIMPL即可。
- STDMETHODIMP CRichEditCtrlEx::DeleteObject(THIS_ LPOLEOBJECT lpoleobj)
- {
- //return S_OK;