从richedit中导出bmp图片保存,已完成。
可是如何从richedit中导出jpg、gif等图片保存?
另外,在接收端从richedit中导出bmp图片保存后,显示的图片发生了水平循环移位,很蹊跷,何故?

解决方案 »

  1.   

    楼主是解析rtf格式 进行导出bmp文件的吗?图片在richedit里面显示出来的时候已经就是位图了吧,如果你把位图取出来,再用图像处理库,转换成Jpg或者png 也可以的呀。 用CxImage这点可以实现。自己现在的richedit 无法把图片直接拖进去,拖进去就不能直接显示图像,请教下楼主可以吗?
      

  2.   

    #if !defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)
    #define AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // OleRichEditCtrl.h : header file
    //
    #include <afxodlgs.h>
    #include <afxpriv.h>
    #include "oleimpl2.h"
    //#include "Richole.h"//#include <richole.h>#include "Richole.h"
    #include <afxole.h>/////////////////////////////////////////////////////////////////////////////
    // COleRichEditCtrl windowclass COleRichEditCtrl : public CRichEditCtrl
    {
    // Construction
    public:
    COleRichEditCtrl();
    virtual ~COleRichEditCtrl(); long StreamInFromResource(int iRes, LPCTSTR sType);protected:
    static DWORD CALLBACK readFunction(DWORD dwCookie,
     LPBYTE lpBuf, // the buffer to fill
     LONG nCount, // number of bytes to read
     LONG* nRead); // number of bytes actually read interface IExRichEditOleCallback; // forward declaration (see below in this header file) IExRichEditOleCallback* m_pIRichEditOleCallback;
    BOOL m_bCallbackSet;


    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);
    };
     public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(COleRichEditCtrl)
    protected:
    virtual void PreSubclassWindow();
    //}}AFX_VIRTUAL// Implementation
    public: void InsertBitmap(HBITMAP hBitmap);
    void InsertBitmap(CString strFileName);
        BOOL SaveBmpDataToFile(HBITMAP hBitmap, CString FileName); //FileName°üÀ¨Â·¾¶ºÍÎļþµÄÈ«Ãû
    static DWORD CALLBACK CStringFormatToRTF(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
    static DWORD CALLBACK RTFFormatToCString(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
    void SetRTF(CString strRTF); void SetRTFa(CString strRTF); CString GetRTF();
    afx_msg void GetOptions(); // Generated message map functions
    protected:
    LPSTORAGE m_lpStorage;  // provides storage for m_lpObject
    LPLOCKBYTES m_lpLockBytes;  // part of implementation of m_lpStorage
    LPOLEOBJECT m_lpObject; // in case you want direct access to the OLE object
    LPVIEWOBJECT2 m_lpViewObject;// IViewObject for IOleObject above //{{AFX_MSG(COleRichEditCtrl)
    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    // afx_msg void OnCopy() { Copy(); }
    afx_msg void OnCopy();

    afx_msg void OnCut() { Cut(); }
    afx_msg void OnPaste() { Paste(); }
    afx_msg void OnSelectall() { SetSel(0, -1); }
    afx_msg void OnUndo() { Undo(); }
    afx_msg void OnClear() { Clear(); }
    afx_msg void OnSelectfont();
    afx_msg void OnFromfile();
    afx_msg void OnSavefile();//afx_msg void GetOptions();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)
      

  3.   

    在QQ中可以直接另存图片为原格式,不知是如何实现的?目前bmp可以,jpg、gif可以插入richedit,但无法导出另存。看看有不有好办法?
      

  4.   

    经查:            STGMEDIUM stg;
                FORMATETC fm;
                fm.cfFormat =CF_BITMAP;
                fm.ptd = NULL;                  // Target Device = Screen
                fm.dwAspect = DVASPECT_TRANSPARENT; // Level of detail = Full content
                fm.lindex = -1;                 // Index = Not applicaple
                fm.tymed = TYMED_GDI ;
                stg.tymed = TYMED_GDI; // Storage medium = HBITMAP handle 
                HRESULT hr = pDataObject->GetData( &fm, &stg );
           图片为jpg、gif时hr返回值总是不对,无法进行保存。
           请指教。
      

  5.   

    你的gif和jpg插入richedit后是不是就破坏了原文件结构
    所以就无法导出了
      

  6.   

    LZ好,我现在对这个rtf文件中图片信息的保存为bmp都有点问题,你说你实现了,能不能帮我一下啊,我看你贴出来的代码中 BOOL SaveBmpDataToFile(HBITMAP hBitmap, CString FileName)这个函数应该是的吧,求具体的方法啊,你这只是头文件啊!拜托了,谢谢!