IOleInPlaceObjectWindowless::GetDropTarget 方法 (ocidl.h)

检索支持拖放的就地活动无窗口对象的 IDropTarget 接口。

语法

HRESULT GetDropTarget(
  [out] IDropTarget **ppDropTarget
);

参数

[out] ppDropTarget

指向 IDropTarget 指针变量的指针,该变量接收指向无窗口对象的接口指针。

返回值

此方法在成功时返回S_OK。 其他可能的返回值包括以下内容。

返回代码 说明
E_NOTIMPL
无窗口对象不支持拖放。

注解

窗口化对象通过调用 RegisterDragDrop 函数并提供其窗口句柄作为参数来注册其 IDropTarget 接口。 注册其 IDropTarget 接口使对象能够参与拖放操作。 由于它在活动时没有窗口,因此无窗口对象无法注册其 IDropTarget 接口。 因此,如果没有容器的支持,它无法直接参与拖放操作。

在涉及无窗口对象的拖放操作期间发生以下事件:

  • 容器通过 RegisterDragDrop 函数注册其自己的 IDropTarget 接口。
  • 在容器实现自己的 IDropTarget::D ragEnterIDropTarget::D ragOver 方法时,容器会检测鼠标指针是否刚刚进入嵌入对象。
  • 如果对象处于非活动状态,容器将调用对象的 IPointerInactive::GetActivationPolicy 方法。 对象返回POINTERINACTIVE_ACTIVATEONDRAG标志。 然后,容器就地激活对象。 如果对象已处于活动状态,则容器不必执行此步骤。
  • 对象处于活动状态后,容器必须获取对象的 IDropTarget 接口。
  • 希望成为放置目标的无窗口对象仍实现 IDropTarget 接口,但不注册它,也不会通过调用 IUnknown::QueryInterface 返回它。 相反,容器可以通过调用对象的 IOleInPlaceObjectWindowless::GetDropTarget 方法获取此接口。 如果对象想要参与拖放操作,则返回指向其自己的 IDropTarget 接口的指针。 容器可以缓存此接口指针供以后使用。 例如,在随后调用容器的 IDropTarget::D ragEnterIDropTarget::D ragLeave 方法时,容器可以使用缓存的指针,而不是再次调用对象的 GetDropTarget 方法。
  • 然后,容器调用对象的 IDropTarget::D ragEnter,并从其自己的 IDropTarget::D ragOverIDropTarget::D ragEnter 方法传递 pdwEffect 的返回值。 此后,容器会将所有后续 IDropTarget::D ragOver 调用转发到无窗口对象,直到鼠标离开对象或对象上发生拖放。 如果鼠标离开对象,容器将调用对象的 IDropTarget::D ragLeave ,然后释放对象的 IDropTarget 接口。 如果发生删除,容器会将 IDropTarget::D rop 调用转发到 对象。
  • 最后,就地容器停用对象。
对象可以从其自己的 IDropTarget::D ragEnter 返回S_FALSE ,以指示它不接受数据对象中的任何数据格式。 在这种情况下,容器可以决定自行接受数据,并从其自己的 IDropTarget::D ragEnterIDropTarget::D ragOver 方法返回相应的 dwEffect

IDropTarget::D ragEnter 返回S_FALSE的对象应准备好接收对 IDropTarget::D ragEnter 的 后续调用,这两者之间没有任何 IDropTarget::D ragLeave 。 事实上,如果在下次调用容器的 IDropTarget::D ragOver 期间鼠标仍然位于同一对象上,则容器可能会决定再次尝试在该对象上调用 IDropTarget::D ragEnter

调用方备注

容器可以缓存指向对象的 IDropTarget 接口的指针,供以后使用。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ocidl.h

另请参阅

IDropTarget

IOleInPlaceObjectWindowless

IPointerInactive::GetActivationPolicy

RegisterDragDrop