Как отключить перетаскивание из элемента управления Rich Edit

Я использую подкласс CRichEditCtrl, чтобы обеспечить контроль типа CEdit+. Одна вещь, которую я хочу, это отключить функцию перетаскивания, которую базовый класс предоставляет по умолчанию.

Отключить сброс легко: ::RevokeDragDrop(m_hWnd);

Но я не вижу простого способа отключить элемент управления, являющийся источником перетаскивания. Есть ли простой способ?

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.

Предостережение: я далеко от своего компилятора, поэтому я не могу это проверить.

Я не могу придумать и простой способ, но...

Это статья о расширении текстового элемента управления для поддержки перетаскивания. http://www.code-magazine.com/article.aspx?quickid=0407031&page=5

Да, это полная противоположность того, что вы хотите.

Но учтите, что речь идет об обнаружении сообщений мыши, указывающих, что вы хотите инициировать действие перетаскивания. Если ваш подкласс сделал это, а затем просто не дал CRichEditCtrl получить сообщение (я) окна, которое запускает перетаскивание, перетаскивание не начнется.

Может работать.

Другие вопросы по тегам