IOleInPlaceObjectWindowless::GetDropTarget 方法 (ocidl.h)
检索支持拖放的就地活动无窗口对象的 IDropTarget 接口。
语法
HRESULT GetDropTarget(
[out] IDropTarget **ppDropTarget
);
参数
[out] ppDropTarget
指向 IDropTarget 指针变量的指针,该变量接收指向无窗口对象的接口指针。
返回值
此方法在成功时返回S_OK。 其他可能的返回值包括以下内容。
返回代码 | 说明 |
---|---|
|
无窗口对象不支持拖放。 |
注解
窗口化对象通过调用 RegisterDragDrop 函数并提供其窗口句柄作为参数来注册其 IDropTarget 接口。 注册其 IDropTarget 接口使对象能够参与拖放操作。 由于它在活动时没有窗口,因此无窗口对象无法注册其 IDropTarget 接口。 因此,如果没有容器的支持,它无法直接参与拖放操作。
在涉及无窗口对象的拖放操作期间发生以下事件:
- 容器通过 RegisterDragDrop 函数注册其自己的 IDropTarget 接口。
- 在容器实现自己的 IDropTarget::D ragEnter 或 IDropTarget::D ragOver 方法时,容器会检测鼠标指针是否刚刚进入嵌入对象。
- 如果对象处于非活动状态,容器将调用对象的 IPointerInactive::GetActivationPolicy 方法。 对象返回POINTERINACTIVE_ACTIVATEONDRAG标志。 然后,容器就地激活对象。 如果对象已处于活动状态,则容器不必执行此步骤。
- 对象处于活动状态后,容器必须获取对象的 IDropTarget 接口。
- 希望成为放置目标的无窗口对象仍实现 IDropTarget 接口,但不注册它,也不会通过调用 IUnknown::QueryInterface 返回它。 相反,容器可以通过调用对象的 IOleInPlaceObjectWindowless::GetDropTarget 方法获取此接口。 如果对象想要参与拖放操作,则返回指向其自己的 IDropTarget 接口的指针。 容器可以缓存此接口指针供以后使用。 例如,在随后调用容器的 IDropTarget::D ragEnter 或 IDropTarget::D ragLeave 方法时,容器可以使用缓存的指针,而不是再次调用对象的 GetDropTarget 方法。
- 然后,容器调用对象的 IDropTarget::D ragEnter,并从其自己的 IDropTarget::D ragOver 或 IDropTarget::D ragEnter 方法传递 pdwEffect 的返回值。 此后,容器会将所有后续 IDropTarget::D ragOver 调用转发到无窗口对象,直到鼠标离开对象或对象上发生拖放。 如果鼠标离开对象,容器将调用对象的 IDropTarget::D ragLeave ,然后释放对象的 IDropTarget 接口。 如果发生删除,容器会将 IDropTarget::D rop 调用转发到 对象。
- 最后,就地容器停用对象。
从 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 |