IOleInPlaceObjectWindowless::GetDropTarget
Supplies the IDropTarget interface for an in-place active, windowless
object that supports drag and drop.
HRESULT GetDropTarget(
IDropTarget** ppDropTarget
|
//Indirect pointer to the IDropTarget interface
|
);
|
|
Parameters
-
ppDropTarget
-
[out] Indirect pointer to the windowless object’s IDropTarget
interface.
Return Values
-
S_OK
-
The IDropTarget interface was successfully returned.
-
E_NOTIMPL
-
The windowless object does not support drag and drop.
Remarks
A windowed object registers its IDropTarget interface
by calling the RegisterDragDrop function and
supplying its window handle as a parameter. Registering its IDropTarget
interface enables the object to participate in drag and drop operations.
Because it does not have a window when active, a windowless object cannot
register its IDropTarget interface. Therefore, it cannot directly
participate in drag and drop operations without support from its container.
The following events occur during a drag and drop operation involving
windowless objects:
-
The container registers its own IDropTarget interface through the RegisterDragDrop
function.
-
In the container’s implementation of its own IDropTarget::DragEnter or IDropTarget::DragOver
methods, the container detects whether the mouse pointer just entered an
embedded object.
-
If the object is inactive, the container calls the object’s
IPointerInactive::GetActivationPolicy
method. The object returns the POINTERINACTIVE_ACTIVATEONDRAG flag. The
container then activates the object in place. If the object was already
active, the container does not have to do this step.
-
Once the object is active, the container must then obtain the object’s IDropTarget
interface.
-
A windowless object that wishes to be a drop target still implements the IDropTarget
interface, but does not register it and does not return it through calls to QueryInterface.
Instead, the container can obtain this interface by calling the object’s IOleInPlaceObjectWindowless::GetDropTarget
method. The object returns a pointer to its own IDropTarget interface
if it wants to participate in drag and drop operations. The container can
cache this interface pointer for later use. For example, on subsequent calls
to the container’s IDropTarget::DragEnter or IDropTarget::DragLeave
methods, the container can use the cached pointer instead of calling the
object’s GetDropTarget method again.
-
The container then calls the object’s IDropTarget::DragEnter and passes
the returned value for *pdwEffect from its own DragOver or DragEnter
methods. From this point on, the container forwards all subsequent DragOver
calls to the windowless object until the mouse leaves the object or a drop
occurs on the object. If the mouse leaves the object, the container calls the
object’s IDropTarget::DragLeave and then releases the object’s IDropTarget
interface. If the drop occurs, the container forwards the IDropTarget::DragDrop
call to the object.
-
Finally, the container in-place deactivates the object.
An object can return S_FALSE from its own IDropTarget::DragEnter to
indicate that it does not accept any of the data formats in the data object.
In that case, the container can decide to accept the data for itself and
return an appropriate dwEffect from its own DragEnter or DragOver
methods. Note that an object that returns S_FALSE from DragEnter should
be prepared to receive subsequent calls to DragEnter without any DragLeave
in between. Indeed, if the mouse is still over the same object during the next
call to the container’s DragOver, the container may decide to try and
call DragEnter again on the object.
Note to Callers
A container can cache the pointer to the object’s IDropTarget interface
for later use.
See Also
IDropTarget,
IPointerInactive::GetActivationPolicy,
RegisterDragDrop