为什么我的RichEdit用了SetOLECallback就响应不了OnDropFiles了?

rangren 2005-03-29 11:12:57
拖拽实现了,但显示出来的文件图标跟原来的不同,没有把文件名标出,
在哪里重写这部分啊?
...全文
275 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuchi 2005-03-29
  • 打赏
  • 举报
回复
你修改一下 IRichEditOleCallback::GetDragDropEffect的属性试试
kingzai 2005-03-29
  • 打赏
  • 举报
回复
//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 dialog



class 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_VIRTUAL

protected:
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
蒋晟 2005-03-29
  • 打赏
  • 举报
回复
http://www.codeproject.com/richedit/COleRichEditCtrl.asp
不用第三方控件,让richEdit支持图片与表格换行 DELPHI 6 提供的RICHEDIT是1.0,并不支持图片,对复杂表格也会乱成一团,如何在DELPHI原有控件的基础上做少量修改,使之支持显示图片与正确显示表格,其实只需要几行就好了,方法如下: 找到richEdit控件所在单元ComCtrls.pas (在SOURCE\VCL) //第一步 procedure TCustomRichEdit.CreateParams(var Params: TCreateParams); const // RichEditModuleName = 'RICHED32.DLL';//原来语句 // RichEditClassName = 'RICHEDIT'; //原来语句 RichEditModuleName = 'Msftedit.dll'; //改后语句 RichEditClassName = 'RichEdit50W'; //改后语句 //第二步 procedure TCustomRichEdit.CreateWnd; .... //加入一行要放在 CreateWnd 因为此时 HANDLE已建立 Perform(EM_SetOleCallback, 0, Longint(TRichEditOleCallback.Create(TRichEdit(self)) as IRichEditOleCallback)) ; //第三步 procedure TCustomRichEdit.WMRButtonUp(var Message: TWMRButtonUp); begin inherited; // RichEd20 does not pass the WM_RBUTTONUP message to defwndproc, // so we get no WM_CONTEXTMENU message. Simulate message here. // if Win32MajorVersion < 5 then //是原有1.0的要去掉 Perform(WM_CONTEXTMENU, Handle, LParam(PointToSmallPoint( ClientToScreen(SmallPointToPoint(Message.Pos))))); end; //第四步 procedure TRichEditStrings.Insert(Index: Integer; const S: string); .... //要去掉后面两名 // 1.0 uses, 2.0 will error happened 2011 // if RichEdit.SelStart (Selection.cpMax + Length(Str)) then //是原有1.0的要去掉 // raise EOutOfResources.Create(sRichEditInsertError); //是原有1.0的要去掉

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧