拖拽实现了,但显示出来的文件图标跟原来的不同,没有把文件名标出,
在哪里重写这部分啊?

解决方案 »

  1.   

    http://www.codeproject.com/richedit/COleRichEditCtrl.asp
      

  2.   

    //impelement a IRichEditOleCallback interface and register it with
    the
    CRichEditCtrl using SetOLECallback() function. The  code for a minimal
    implementation of IRichEditOleCallback is below:from the dialogs Header file:class CRichEditOleCallback : public IRichEditOleCallback
    {
    public: STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * lplpObj);
     STDMETHOD_(ULONG, AddRef) ();
     STDMETHOD_(ULONG, Release) ();
     STDMETHOD (GetNewStorage) (LPSTORAGE FAR * lplpstg);
     STDMETHOD (GetInPlaceContext) (LPOLEINPLACEFRAME FAR * lplpFrame,
    LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
     STDMETHOD (ShowContainerUI) (BOOL fShow);
     STDMETHOD (QueryInsertObject) (LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
     STDMETHOD (DeleteObject) (LPOLEOBJECT lpoleobj);
     STDMETHOD (QueryAcceptData) (LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *
    lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
     STDMETHOD (ContextSensitiveHelp) (BOOL fEnterMode);
     STDMETHOD (GetClipboardData) (CHARRANGE FAR * lpchrg, DWORD reco,
    LPDATAOBJECT
    FAR * lplpdataobj);
     STDMETHOD (GetDragDropEffect) (BOOL fDrag, DWORD grfKeyState, LPDWORD
    pdwEffect);
     STDMETHOD (GetContextMenu) (WORD seltype, LPOLEOBJECT lpoleobj,CHARRANGE
    FAR *
    lpchrg, HMENU FAR * lphmenu);
    };////////////////////////////////////////////////////////////////////////////
    /
    // CPasteBitmapToRichEditDlg dialogclass CPasteBitmapToRichEditDlg : public CDialog
    {
    // Construction
    public:
     CPasteBitmapToRichEditDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
    //{{AFX_DATA(CPasteBitmapToRichEditDlg)
     enum { IDD = IDD_PASTEBITMAPTORICHEDIT_DIALOG };
     CRichEditCtrl m_RichEditCtrl;
    //}}AFX_DATA // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CPasteBitmapToRichEditDlg)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
     //}}AFX_VIRTUALprotected:
     HICON m_hIcon;   CRichEditOleCallback m_RichEditOleCallback; // Generated message map functions
     //{{AFX_MSG(CPasteBitmapToRichEditDlg)
     virtual BOOL OnInitDialog();
     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
     afx_msg void OnPaint();
     afx_msg HCURSOR OnQueryDragIcon(); //}}AFX_MSG
     DECLARE_MESSAGE_MAP()};Dialogs implementation file:STDMETHODIMP CRichEditOleCallback::QueryInterface(REFIID riid, LPVOID FAR *
    lplpObj)
    {
     if (riid == IID_IUnknown || riid == IID_IRichEditOleCallback)
     {
      *lplpObj = (void*)this;
      return S_OK;
     }
     else
     {
      *lplpObj = NULL;
      return E_NOINTERFACE;
     } 
    }STDMETHODIMP_(ULONG) CRichEditOleCallback::AddRef()
    {
     return 1;
    }STDMETHODIMP_(ULONG) CRichEditOleCallback::Release()
    {
     return 1;
    }STDMETHODIMP CRichEditOleCallback::GetNewStorage(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;}STDMETHODIMP CRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR *
    lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO
    lpFrameInfo)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::ShowContainerUI(BOOL fShow)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid,
    LPSTORAGE
    lpstg, LONG cp)
    {
     return S_OK;
    }STDMETHODIMP CRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj,
    CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict)
    {
    // implement checks in code here, for example is the format acceptable
     // user back pointer to CRichEditCtrl (above) to execute certain routines
     // return S_OK if everthing is OK else return E_FAIL
       return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg,
    DWORD reco, LPDATAOBJECT FAR * lplpdataobj)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD
    grfKeyState, LPDWORD pdwEffect)
    {
     return E_NOTIMPL;
    }STDMETHODIMP CRichEditOleCallback::GetContextMenu(WORD seltype, LPOLEOBJECT
    lpoleobj,CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu)
    {
     return E_NOTIMPL;
    }/////////////////////////////////////////////////
    BOOL CPasteBitmapToRichEditDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
     .
     .
     .
     BOOL bSuccess = m_RichEditCtrl.SetOLECallback(&m_RichEditOleCallback);
     .
     .
     .
    }
    Have a look at the official sample in Q141549
      

  3.   

    你修改一下 IRichEditOleCallback::GetDragDropEffect的属性试试