c++ - 与 VCL 窗体一起使用时 IDropTarget 出现问题

标签 c++ com drag-and-drop vcl

我有一个用 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/

相关文章:

c++ - 函数声明中的最大参数个数

c++ - 使用 LAME API 将 M4A(MPEG-4 音频)转换为 MP3 的 C 或 C++ 代码

c++ - 为什么 CoCreateInstance 在某些 Windows 上返回 REGDB_E_CLASSNOTREG?

java - 为什么列表元素不交换?

c++ - 禁用 malloc 中的随机性

c++ - 针对给定问题的优化算法?

c# - Excel 互操作 COM 不关闭

c# - GetActiveObject() 与 GetObject() - MK_E_UNAVAILABLE 错误

android - 如何获取 View 的边距,移动到运行时未知的位置

javascript - 在同一页面上从一个 slickgrid 拖放到另一个