I use a subclass of CRichEditCtrl to provide a CEdit+ type control. One thing I want is to disable drag-drop functionality, which the base class provided by default.
开发者_JAVA百科Disabling dropping is easy: ::RevokeDragDrop(m_hWnd);
But I can't see a simple way to disable the control being a drag-source. Is there an easy way?
To Override Starting Drag-and-Drop in the RichEdit
Control:
- Implement
IRichEditOleCallback
interface. - implement
GetDragDropEffect()
method of the interface like this:
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 !!!!
}
Most important here is return E_ABORT;
this causes quitting default drag and drop operation and starting the customized one.
To Override Receiving Drag and Drop Operation in the RichEdit
Control:
- Implement your own
IDropTarget
Interface. - Register
IDropTarget
interface like this:
After Creating RichEdit
control in RichEdit
derived subclass function:
CComPtr<IDropTarget> pDropTarget; // this is your own customized drop target.
RevokeDragDrop(m_hWnd); // unregister default IDropTarget interface of Rich Edit.
RegisterDragDrop(m_hWnd, pDropTarget);
This example overrides the default drop target function of RichEdit
.
Caveat: I'm away from my compiler, so I can't check this.
I can't think of a simple way either, but ...
This is an article about extending a text control to support dragging. http://www.code-magazine.com/article.aspx?quickid=0407031&page=5
Yes, it's the exact opposite of what you want.
But consider that it's about detecting the mouse messages that indicate that you want to initiate a drag action. If your subclass did this, and then just didn't let the CRichEditCtrl get the window message(s) that triggers the drag, the drag wouldn't start.
Might work.
精彩评论