Win32 SDK 中的RichEdit如何让它插入图片? 我建立了一个,插入不了图片。

解决方案 »

  1.   

    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"));//如不需要以后可去掉如有疏漏可查看网上相关资料
      

  2.   

    注:程序里的MB是我当初测试时加的宏,其实就是MessageBox,楼主注释掉即可