系统XP sp2 VC8 SDK
------------------我给自己的RichEdit控件添加了一系列接口实现(网上搬的代码,呵呵),使它可以接收剪贴板中的图片(目前只发现gif格式不可以)。并且可以用EM_STREAMOUT 导出保存。发现一个问题:如果一幅图片用windows自带的画图程序打开,然后复制其中图像,再粘贴到我的RichEdit控件中,至此一切还正常。但随后发现,图像并不能够被导出保存。而且发现,windows的写字板也如此,大家可自己试一下。(这应算windows一个bug吧)另注:其它程序打开图像都可以(如PS,网络浏览器)只有"老大"WORD不受此限。 麻烦高手给指点下其中玄机,起码我想知道一个方法可以识别出windows画图程序来的数据,因为客户可能使用其中图片。(要么你就别显示到控件上,能显示却不能保存,XXX (文明用语))因担心没有人能回答此问题或看不到该贴,本贴暂放30分,如有人能解答,我一定另发一贴再送回贴者70分!

解决方案 »

  1.   

    代码也没什么,就是实现了RichEdit的一系列接口(我网上搬的代码),这样从别的地方COPY图片后可以PASTE到RichEdit控件中,还能用EM_STREAMOUT导出保存   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);
      };
      

  2.   

    代码也没什么,就是实现了RichEdit的一系列接口(我网上搬的代码),这样从别的地方COPY图片后可以PASTE到RichEdit控件中,还能用EM_STREAMOUT导出保存   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);
      };
      

  3.   

    貌似这个跟ole嵌入richedit中的文件锁定方面有点关系 瞎猜
      

  4.   

    OLE我真不懂啊,代码是网上抄的。麻烦能介绍详细些吗