我在Codegear开发了一个VCL gui。我为mainform创建了一个DropTarget,DropTarget对象实现了IDropTarget接口,允许我从explorer中拖放文件。现在因为我只想要一些子组件是drop目标(而不是整个表单),所以当POINTL坐标在组件的边界内时,我只有DragEnter方法返回S_OK。
但是,如果我将项目缓慢拖动到表单的边界而不是组件,DragEnter将返回E_NOINTERFACE,因此不允许删除。如果我继续拖入dropzone,DragEnter将不会触发,我理解为什么它不会触发。所以我的问题是如何手动触发DragEnter事件?
答案 0 :(得分:3)
听起来你忽略了IDropTarget除了DragEnter()之外你还需要使用DragOver()方法。如果DragEnter()不以您允许的坐标开头,则必须返回S_OK
并将pdwEffect参数设置为DROPEFFECT_NONE
,然后让DragOver()继续执行自己的坐标检查。 / p>
此外,由于您只想拖动到特定控件,您应该为每个控件调用RegisterDragDrop()(假设它们是TWinControl后代),而不是TForm本身。