Как отключить перетаскивание из элемента управления Rich Edit
Я использую подкласс CRichEditCtrl, чтобы обеспечить контроль типа CEdit+. Одна вещь, которую я хочу, это отключить функцию перетаскивания, которую базовый класс предоставляет по умолчанию.
Отключить сброс легко: ::RevokeDragDrop(m_hWnd);
Но я не вижу простого способа отключить элемент управления, являющийся источником перетаскивания. Есть ли простой способ?
1 ответ
Чтобы отменить запуск перетаскивания в RichEdit
Контроль:
- Осуществлять
IRichEditOleCallback
интерфейс. - осуществлять
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
Контроль:
- Реализуй свой собственный
IDropTarget
Интерфейс. - регистр
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 получить сообщение (я) окна, которое запускает перетаскивание, перетаскивание не начнется.
Может работать.