如何禁用从Rich Edit Control拖动

时间:2010-03-19 10:50:15

标签: mfc winapi richedit cricheditctrl

我使用CRichEditCtrl的子类来提供CEdit +类型控件。我想要的一件事是禁用拖放功能,默认情况下提供基类。

禁用丢弃很容易:::RevokeDragDrop(m_hWnd);

但我看不到一种简单的方法来禁用控件作为拖动源。有一个简单的方法吗?

2 个答案:

答案 0 :(得分:1)

要覆盖RichEdit控件中的开始拖放操作,

  1. 实施IRichEditOleCallback界面。
  2. 界面的
  3. 实现GetDragDropEffect()方法如下:
HRESULT CRichEditOleCallback::GetDragDropEffect( BOOL fDrag, DWORD grfKeyState,
            LPDWORD pdwEffect)
{
    CComPtr<IDataObject> pdata_obj;
    CComQIPtr<IDropSource> psource;
    DWORD dwEffect;

    // You put here your own data-object code....

    DoDragDrop( pdata_obj, psource, DROPEFFECT_COPY|DROPEFFECT_MOVE, &dwEffect);
    // This executes your own drag and drop function.


    return E_ABORT; // !!!! THIS IS ESSENTIALLY IMPORTANT !!!! NOT WRITTEN IN MANUAL !!!!
}

此处最重要的是return E_ABORT;,这会导致退出默认的拖放操作并开始自定义操作。

要覆盖RichEdit控件中的接收拖放操作,请执行以下操作:

  1. 实现自己的IDropTarget界面。
  2. 像这样注册IDropTarget界面:

RichEdit派生的子类函数中创建RichEdit控件之后:

CComPtr<IDropTarget> pDropTarget; // this is your own customized drop target.

RevokeDragDrop(m_hWnd); // unregister default IDropTarget interface of Rich Edit.
RegisterDragDrop(m_hWnd, pDropTarget);

此示例覆盖了RichEdit的默认放置目标功能。

答案 1 :(得分:0)

警告:我离开了我的编译器,所以我无法检查它。

我想不出一个简单的方法,但是......

这是一篇关于扩展文本控件以支持拖动的文章。 http://www.code-magazine.com/article.aspx?quickid=0407031&page=5

是的,这与你想要的完全相反。

但请注意,它是关于检测指示您要启动拖动操作的鼠标消息。如果您的子类执行此操作,然后只是没有让CRichEditCtrl获取触发拖动的窗口消息,则拖动将无法启动。

可能会工作。