0

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

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

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

4

2 回答 2

1

RichEdit要覆盖控件中的开始拖放:

  1. 实现IRichEditOleCallback接口。
  2. 接口的实现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

于 2020-02-19T03:30:53.993 回答
0

警告:我远离我的编译器,所以我无法检查这个。

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

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

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

但考虑到它是关于检测表明您要启动拖动操作的鼠标消息。如果您的子类这样做,然后只是没有让 CRichEditCtrl 获得触发拖动的窗口消息,则拖动不会开始。

可能会奏效。

于 2010-03-19T11:34:35.560 回答