我使用CRichEditCtrl的子类来提供CEdit +类型控件。我想要的一件事是禁用拖放功能,默认情况下提供基类。
禁用丢弃很容易:::RevokeDragDrop(m_hWnd);
但我看不到一种简单的方法来禁用控件作为拖动源。有一个简单的方法吗?
答案 0 :(得分: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
的默认放置目标功能。
答案 1 :(得分:0)
我想不出一个简单的方法,但是......
这是一篇关于扩展文本控件以支持拖动的文章。 http://www.code-magazine.com/article.aspx?quickid=0407031&page=5
是的,这与你想要的完全相反。
但请注意,它是关于检测指示您要启动拖动操作的鼠标消息。如果您的子类执行此操作,然后只是没有让CRichEditCtrl获取触发拖动的窗口消息,则拖动将无法启动。
可能会工作。