Win32 SDK 中的RichEdit如何让它插入图片? Win32 SDK 中的RichEdit如何让它插入图片? 我建立了一个,插入不了图片。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 wiin32SDK中的RichEdit插入图片需要手动实现一些接口,代码如下: ////接口声明/////////////////////////////////////////////////////// interface IExRichEditOleCallback : public IRichEditOleCallback { public : IExRichEditOleCallback(); virtual ~ IExRichEditOleCallback(); int m_iNumStorages; IStorage * pStorage; DWORD m_dwRef; virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE * lplpstg); virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo); virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow); virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp); virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj); virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict); virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj); virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect); virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu); }; ////接口实现///////////////////////////////////////////////CRichEdit::IExRichEditOleCallback::IExRichEditOleCallback(){pStorage = NULL;m_iNumStorages = 0 ;m_dwRef = 0 ;// set up OLE storage HRESULT hResult = ::StgCreateDocfile(NULL, STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE /* | STGM_DELETEONRELEASE */ | STGM_CREATE , 0 , & pStorage );if ( pStorage == NULL || hResult != S_OK ){ //AfxThrowOleException( hResult ); MB(TEXT("OLE错误1"));}}CRichEdit::IExRichEditOleCallback:: ~ IExRichEditOleCallback(){}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::GetNewStorage(LPSTORAGE * lplpstg){m_iNumStorages ++ ;WCHAR tName[ 50 ];swprintf(tName, L" REOLEStorage%d " , m_iNumStorages);HRESULT hResult = pStorage -> CreateStorage(tName, STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE , 0 , 0 , lplpstg );if (hResult != S_OK ){ //::AfxThrowOleException( hResult ); MB(TEXT("OLE错误2"));}return hResult;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::QueryInterface(REFIID iid, void ** ppvObject){HRESULT hr = S_OK;* ppvObject = NULL;if ( iid == IID_IUnknown || iid == IID_IRichEditOleCallback ){ * ppvObject = this ; AddRef(); hr = NOERROR;}else { hr = E_NOINTERFACE;}return hr;}ULONG STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::AddRef(){return ++ m_dwRef;}ULONG STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::Release(){if ( -- m_dwRef == 0 ){ delete this ; return 0 ;}return m_dwRef;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame,LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::ShowContainerUI(BOOL fShow){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat,DWORD reco, BOOL fReally, HGLOBAL hMetaPict){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj){return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect){return S_OK;}HRESULT STDMETHODCALLTYPE CRichEdit::IExRichEditOleCallback::GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg,HMENU FAR * lphmenu){return S_OK;}////将接口添加至RichEdit////////////////////////////////////////////////////m_pIRichEditOleCallback=NULL ;m_pIRichEditOleCallback = new IExRichEditOleCallback;SendMessage(hwndRichEdit,EM_SETOLECALLBACK, 0,(LPARAM)m_pIRichEditOleCallback);这样就可以粘贴进图片了保险起见:程序加载时:LoadLibrary(TEXT("Riched20.dll"));//如不需要以后可去掉如有疏漏可查看网上相关资料 注:程序里的MB是我当初测试时加的宏,其实就是MessageBox,楼主注释掉即可 Webbrowser 滚动条定位遇到了最严峻的问题 求高手赐教!在线等答案! 关于光标移动 关于CRichEditCtrl中右键菜单并获取对象的信息的问题?(比较急,找了很久了都没有解决!) 请教:关于CAsyncScoket 请教各位高手:如何才能在屏幕上显示出32位的颜色信息 为什么我为菜单定义的键盘快捷键没反应呢? 各位达人们,帮忙看看regdeletekey函数用法,删除注册表一个子键函数,谢谢了 奇怪的问题,高手请进!!! 关于使用VC编写商业逻辑开发B/S系统?? SDK是那几个单词的缩写? 【菜鸟问题】动态创建文本框时的错误 关于BMP图片的问题,高人来解答了
interface IExRichEditOleCallback : public IRichEditOleCallback
{
public : IExRichEditOleCallback();
virtual ~ IExRichEditOleCallback();
int m_iNumStorages;
IStorage * pStorage;
DWORD m_dwRef; virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE * lplpstg);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame,
LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);
virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);
virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat,
DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj);
virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);
virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg,
HMENU FAR * lphmenu);
}; ////接口实现///////////////////////////////////////////////
CRichEdit::IExRichEditOleCallback::IExRichEditOleCallback()
{
pStorage = NULL;
m_iNumStorages = 0 ;
m_dwRef = 0 ;// set up OLE storage HRESULT hResult = ::StgCreateDocfile(NULL,
STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE /* | STGM_DELETEONRELEASE */ | STGM_CREATE ,
0 , & pStorage );if ( pStorage == NULL ||
hResult != S_OK )
{
//AfxThrowOleException( hResult );
MB(TEXT("OLE错误1"));
}
}CRichEdit::IExRichEditOleCallback:: ~ IExRichEditOleCallback()
{
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::GetNewStorage(LPSTORAGE * lplpstg)
{
m_iNumStorages ++ ;
WCHAR tName[ 50 ];
swprintf(tName, L" REOLEStorage%d " , m_iNumStorages);HRESULT hResult = pStorage -> CreateStorage(tName,
STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE ,
0 , 0 , lplpstg );if (hResult != S_OK )
{
//::AfxThrowOleException( hResult );
MB(TEXT("OLE错误2"));
}return hResult;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::QueryInterface(REFIID iid, void ** ppvObject)
{HRESULT hr = S_OK;
* ppvObject = NULL;if ( iid == IID_IUnknown ||
iid == IID_IRichEditOleCallback )
{
* ppvObject = this ;
AddRef();
hr = NOERROR;
}
else
{
hr = E_NOINTERFACE;
}return hr;
}ULONG STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::AddRef()
{
return ++ m_dwRef;
}
ULONG STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::Release()
{
if ( -- m_dwRef == 0 )
{
delete this ;
return 0 ;
}return m_dwRef;
}
HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame,
LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::ShowContainerUI(BOOL fShow)
{
return S_OK;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp)
{
return S_OK;
}
HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj)
{
return S_OK;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat,
DWORD reco, BOOL fReally, HGLOBAL hMetaPict)
{
return S_OK;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode)
{
return S_OK;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect)
{
return S_OK;
}HRESULT STDMETHODCALLTYPE
CRichEdit::IExRichEditOleCallback::GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg,
HMENU FAR * lphmenu)
{
return S_OK;
}
////将接口添加至RichEdit////////////////////////////////////////////////////
m_pIRichEditOleCallback=NULL ;
m_pIRichEditOleCallback = new IExRichEditOleCallback;
SendMessage(hwndRichEdit,EM_SETOLECALLBACK, 0,(LPARAM)m_pIRichEditOleCallback);
这样就可以粘贴进图片了
保险起见:程序加载时:LoadLibrary(TEXT("Riched20.dll"));//如不需要以后可去掉如有疏漏可查看网上相关资料