我有一个用 Codegear 开发的 VCL gui。我为主窗体创建了一个 DropTarget,DropTarget 对象实现了 IDropTarget 接口(interface),它允许我从资源管理器中拖放文件。现在因为我只希望一些子组件成为放置目标(而不是整个表单),所以当 POINTL 坐标在组件的边界内时,我只让 DragEnter 方法返回 S_OK。
但是,如果我将项目缓慢拖入窗体的边界而不是组件,DragEnter 返回 E_NOINTERFACE,因此不允许放置。如果我继续拖入拖放区,DragEnter 将不会触发,我明白它为什么不触发。所以我的问题是如何手动触发 DragEnter 事件?
最佳答案
您似乎忽略了 IDropTarget 有一个 DragOver() 方法,除了 DragEnter() 之外您还需要使用该方法。如果 DragEnter() 没有以您允许的坐标开始,那么您必须返回 S_OK
并将 pdwEffect 参数设置为 DROPEFFECT_NONE
,然后让 DragOver() 继续执行它的操作之后自己进行坐标检查。
此外,由于您只想拖动到特定控件上,因此您应该为每个单独的控件(假设它们是 TWinControl 后代)调用 RegisterDragDrop(),而不是为 TForm 本身调用。
关于c++ - 与 VCL 窗体一起使用时 IDropTarget 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1204935/