En el siguiente ejemplo se muestra una operación de arrastrar y colocar entre dos controles ListBox. En el ejemplo se llama al método DoDragDrop cuando se inicia la acción de arrastrar. La acción de arrastrar se inicia si se ha movido el mouse más de SystemInformation..::.DragSize desde su ubicación durante el evento MouseDown. El método IndexFromPoint se utiliza para determinar el índice del elemento que se va a arrastrar durante el evento MouseDown.
En el ejemplo también se muestra la utilización de cursores personalizados para la operación de arrastrar y colocar. En este ejemplo, se supone que hay dos archivos de cursor (3dwarro.cur y 3dwno.cur) en el directorio de la aplicación para los cursores de arrastrar y colocar personalizados, respectivamente. Los cursores personalizados se utilizan si se ha activado UseCustomCursorsCheckCheckBox. Los cursores personalizados se establecen en el controlador de eventos GiveFeedback.
El estado del teclado se evalúa en el controlador de eventos DragOver en el ListBox de la derecha para determinar la operación de arrastrar en función del estado de las teclas MAYÚS, CTRL, ALT o CTRL+ALT. La ubicación en ListBox donde se va a producir la operación de colocar también se determina durante el evento DragOver. Si los datos que se van a colocar no son de tipo String, DragEventArgs..::.Effect se establece en DragDropEffects..::.None. Por último, el estado de la operación de colocar se muestra en DropLocationLabelLabel.
Los datos que se van a colocar en el ListBox de la derecha se determinan en el controlador de eventos DragDrop y el valor String se agrega a la ubicación apropiada de ListBox. Si la operación de arrastrar se realiza fuera de los límites del formulario, la operación de arrastrar y colocar se cancelará en el controlador de eventos QueryContinueDrag.
En este fragmento de código se muestra la forma de utilizar la clase GiveFeedbackEventArgs. Para obtener el ejemplo completo del código, vea el método DoDragDrop.
Private Sub ListDragSource_GiveFeedback(ByVal sender As Object, ByVal e As GiveFeedbackEventArgs) Handles ListDragSource.GiveFeedback
' Use custom cursors if the check box is checked.
If (UseCustomCursorsCheck.Checked) Then
' Set the custom cursor based upon the effect.
e.UseDefaultCursors = False
If ((e.Effect And DragDropEffects.Move) = DragDropEffects.Move) Then
Cursor.Current = MyNormalCursor
Else
Cursor.Current = MyNoDropCursor
End If
End If
End Sub
private void ListDragSource_GiveFeedback(object sender, System.Windows.Forms.GiveFeedbackEventArgs e)
{
// Use custom cursors if the check box is checked.
if (UseCustomCursorsCheck.Checked) {
// Sets the custom cursor based upon the effect.
e.UseDefaultCursors = false;
if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
Cursor.Current = MyNormalCursor;
else
Cursor.Current = MyNoDropCursor;
}
}
void ListDragSource_GiveFeedback( Object^ /*sender*/, System::Windows::Forms::GiveFeedbackEventArgs^ e )
{
// Use custom cursors if the check box is checked.
if ( UseCustomCursorsCheck->Checked )
{
// Sets the custom cursor based upon the effect.
e->UseDefaultCursors = false;
if ( (e->Effect & DragDropEffects::Move) == DragDropEffects::Move )
::Cursor::Current = MyNormalCursor;
else
::Cursor::Current = MyNoDropCursor;
}
}
private void listDragSource_GiveFeedback(Object sender,
System.Windows.Forms.GiveFeedbackEventArgs e)
{
// Use custom cursors if the check box is checked.
if (useCustomCursorsCheck.get_Checked()) {
// Sets the custom cursor based upon the effect.
e.set_UseDefaultCursors(false);
if ((e.get_Effect() & DragDropEffects.Move)
== DragDropEffects.Move) {
get_Cursor().set_Current(myNormalCursor);
}
else {
get_Cursor().set_Current(myNoDropCursor);
}
}
} //listDragSource_GiveFeedback