Control.DoDragDrop Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Přetížení
DoDragDrop(Object, DragDropEffects, Bitmap, Point, Boolean) |
Spustí operaci přetažení. |
DoDragDrop(Object, DragDropEffects) |
Zahájí operaci přetažení. |
DoDragDrop(Object, DragDropEffects, Bitmap, Point, Boolean)
Spustí operaci přetažení.
public:
System::Windows::Forms::DragDropEffects DoDragDrop(System::Object ^ data, System::Windows::Forms::DragDropEffects allowedEffects, System::Drawing::Bitmap ^ dragImage, System::Drawing::Point cursorOffset, bool useDefaultDragImage);
public System.Windows.Forms.DragDropEffects DoDragDrop (object data, System.Windows.Forms.DragDropEffects allowedEffects, System.Drawing.Bitmap? dragImage, System.Drawing.Point cursorOffset, bool useDefaultDragImage);
member this.DoDragDrop : obj * System.Windows.Forms.DragDropEffects * System.Drawing.Bitmap * System.Drawing.Point * bool -> System.Windows.Forms.DragDropEffects
Public Function DoDragDrop (data As Object, allowedEffects As DragDropEffects, dragImage As Bitmap, cursorOffset As Point, useDefaultDragImage As Boolean) As DragDropEffects
Parametry
- data
- Object
- allowedEffects
- DragDropEffects
- dragImage
- Bitmap
- cursorOffset
- Point
- useDefaultDragImage
- Boolean
Návraty
Hodnota z výčtu DragDropEffects , která představuje konečný efekt, který byl proveden během operace přetažení.
Poznámky
Parametr allowedEffects
určuje, ke kterým operacím přetažení může dojít. Pokud operace přetažení potřebuje spolupracovat s aplikacemi v jiném procesu, data
měla by to být buď základní spravovaná třída (String, Bitmap, nebo Metafile), nebo některá Object , která implementuje ISerializable. data
může být také libovolná Object , která implementuje IDataObject. dragImage
je rastrový obrázek, který se zobrazí během operace přetažení, a cursorOffset
určuje umístění kurzoru v dragImage
objektu , což je posun od levého horního rohu. Zadejte true
pro useDefaultDragImage
, pokud chcete použít obrázek přetažení okna ve vrstvě o velikosti 96 × 96; jinak false
. Všimněte si, že pokud šířka nebo výška obrázku přesáhne 300 pixelů, vnější okraje dragImage
jsou prolnutí.
Vzhledem k tomu DoDragDrop(Object, DragDropEffects, Bitmap, Point, Boolean) , že vždy provádí krok násobení RGB při výpočtu alfa hodnoty, měli byste vždy předat Bitmap hodnotu bez předběžného prolnutí alfa. Z předání Bitmap s přednásobeným prolnutím alfa nedojde k žádné chybě, ale tato metoda ho znovu vynásobí a výslednou alfa hodnotu zdvojnásobí.
Platí pro
DoDragDrop(Object, DragDropEffects)
Zahájí operaci přetažení.
public:
System::Windows::Forms::DragDropEffects DoDragDrop(System::Object ^ data, System::Windows::Forms::DragDropEffects allowedEffects);
public System.Windows.Forms.DragDropEffects DoDragDrop (object data, System.Windows.Forms.DragDropEffects allowedEffects);
member this.DoDragDrop : obj * System.Windows.Forms.DragDropEffects -> System.Windows.Forms.DragDropEffects
Public Function DoDragDrop (data As Object, allowedEffects As DragDropEffects) As DragDropEffects
Parametry
- data
- Object
Data, která chcete přetáhnout.
- allowedEffects
- DragDropEffects
Jedna z DragDropEffects hodnot.
Návraty
Hodnota z výčtu DragDropEffects , která představuje konečný efekt, který byl proveden během operace přetažení.
Příklady
Následující příklad kódu ukazuje operaci přetažení mezi dvěma ListBox ovládacími prvky. Příklad volá metodu DoDragDrop při spuštění akce přetažení. Akce přetažení se spustí, pokud se myš během MouseDown události přesunula více než SystemInformation.DragSize z umístění myši. Metoda IndexFromPoint se používá k určení indexu položky, která se má během MouseDown
události přetáhnout.
Příklad také ukazuje použití vlastních kurzorů pro operaci přetažení. Příklad vyžaduje, 3dwarro.cur
aby v adresáři aplikace existovaly dva soubory kurzoru a 3dwno.cur
, pro vlastní kurzory přetahování a bez přetažení. Vlastní kurzory se použijí, pokud je zaškrtnuté UseCustomCursorsCheck
CheckBox políčko . Vlastní kurzory jsou nastaveny v obslužné rutině GiveFeedback události.
Stav klávesnice se vyhodnocuje v DragOver obslužné rutině události pro pravou ListBox
, aby bylo možné určit, jaká bude operace přetažení na základě stavu kláves SHIFT, CTRL, ALT nebo CTRL+ALT. Během události se určí také umístění v ListBox
místě, kde by k poklesu DragOver
došlo. Pokud data, která se mají vypustit, nejsou String
, DragEventArgs.Effect nastaví se v DragDropEffectsna None
hodnotu . Nakonec se stav přetažení zobrazí v DropLocationLabel
Label.
Data, která se mají vpravo vynechat ListBox
, se určí v obslužné rutině DragDrop události a String
hodnota se přidá na příslušném místě v ListBox
. Pokud se operace přetažení přesune mimo hranice formuláře, operace přetažení se v obslužné rutině QueryContinueDrag události zruší.
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
namespace Snip_DragNDrop
{
public ref class Form1: public System::Windows::Forms::Form
{
private:
System::Windows::Forms::ListBox^ ListDragSource;
System::Windows::Forms::ListBox^ ListDragTarget;
System::Windows::Forms::CheckBox^ UseCustomCursorsCheck;
System::Windows::Forms::Label ^ DropLocationLabel;
Int32 indexOfItemUnderMouseToDrag;
Int32 indexOfItemUnderMouseToDrop;
Rectangle dragBoxFromMouseDown;
Point screenOffset;
System::Windows::Forms::Cursor^ MyNoDropCursor;
System::Windows::Forms::Cursor^ MyNormalCursor;
public:
Form1()
{
this->ListDragSource = gcnew System::Windows::Forms::ListBox;
this->ListDragTarget = gcnew System::Windows::Forms::ListBox;
this->UseCustomCursorsCheck = gcnew System::Windows::Forms::CheckBox;
this->DropLocationLabel = gcnew System::Windows::Forms::Label;
this->SuspendLayout();
// ListDragSource
array<Object^>^temp0 = {"five","six","seven","eight","nine","ten"};
this->ListDragSource->Items->AddRange( temp0 );
this->ListDragSource->Location = System::Drawing::Point( 10, 17 );
this->ListDragSource->Size = System::Drawing::Size( 120, 225 );
this->ListDragSource->MouseDown += gcnew System::Windows::Forms::MouseEventHandler( this, &Form1::ListDragSource_MouseDown );
this->ListDragSource->QueryContinueDrag += gcnew System::Windows::Forms::QueryContinueDragEventHandler( this, &Form1::ListDragSource_QueryContinueDrag );
this->ListDragSource->MouseUp += gcnew System::Windows::Forms::MouseEventHandler( this, &Form1::ListDragSource_MouseUp );
this->ListDragSource->MouseMove += gcnew System::Windows::Forms::MouseEventHandler( this, &Form1::ListDragSource_MouseMove );
this->ListDragSource->GiveFeedback += gcnew System::Windows::Forms::GiveFeedbackEventHandler( this, &Form1::ListDragSource_GiveFeedback );
// ListDragTarget
this->ListDragTarget->AllowDrop = true;
this->ListDragTarget->Location = System::Drawing::Point( 154, 17 );
this->ListDragTarget->Size = System::Drawing::Size( 120, 225 );
this->ListDragTarget->DragOver += gcnew System::Windows::Forms::DragEventHandler( this, &Form1::ListDragTarget_DragOver );
this->ListDragTarget->DragDrop += gcnew System::Windows::Forms::DragEventHandler( this, &Form1::ListDragTarget_DragDrop );
this->ListDragTarget->DragEnter += gcnew System::Windows::Forms::DragEventHandler( this, &Form1::ListDragTarget_DragEnter );
this->ListDragTarget->DragLeave += gcnew System::EventHandler( this, &Form1::ListDragTarget_DragLeave );
// UseCustomCursorsCheck
this->UseCustomCursorsCheck->Location = System::Drawing::Point( 10, 243 );
this->UseCustomCursorsCheck->Size = System::Drawing::Size( 137, 24 );
this->UseCustomCursorsCheck->Text = "Use Custom Cursors";
// DropLocationLabel
this->DropLocationLabel->Location = System::Drawing::Point( 154, 245 );
this->DropLocationLabel->Size = System::Drawing::Size( 137, 24 );
this->DropLocationLabel->Text = "None";
// Form1
this->ClientSize = System::Drawing::Size( 292, 270 );
array<System::Windows::Forms::Control^>^formControls = {this->ListDragSource,this->ListDragTarget,this->UseCustomCursorsCheck,this->DropLocationLabel};
this->Controls->AddRange( formControls );
this->Text = "drag-and-drop Example";
this->ResumeLayout( false );
}
private:
void ListDragSource_MouseDown( Object^ /*sender*/, System::Windows::Forms::MouseEventArgs^ e )
{
// Get the index of the item the mouse is below.
indexOfItemUnderMouseToDrag = this->ListDragSource->IndexFromPoint( e->X, e->Y );
if ( indexOfItemUnderMouseToDrag != ListBox::NoMatches )
{
// Remember the point where the mouse down occurred. The DragSize indicates
// the size that the mouse can move before a drag event should be started.
System::Drawing::Size dragSize = SystemInformation::DragSize;
// Create a rectangle using the DragSize, with the mouse position being
// at the center of the rectangle.
dragBoxFromMouseDown = Rectangle(Point(e->X - (dragSize.Width / 2),e->Y - (dragSize.Height / 2)),dragSize);
}
else
dragBoxFromMouseDown = Rectangle::Empty;
// Reset the rectangle if the mouse is not over an item in the ListBox.
}
void ListDragSource_MouseUp( Object^ /*sender*/, System::Windows::Forms::MouseEventArgs^ /*e*/ )
{
// Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle::Empty;
}
void ListDragSource_MouseMove( Object^ /*sender*/, System::Windows::Forms::MouseEventArgs^ e )
{
if ( (e->Button & ::MouseButtons::Left) == ::MouseButtons::Left )
{
// If the mouse moves outside the rectangle, start the drag.
if ( dragBoxFromMouseDown != Rectangle::Empty && !dragBoxFromMouseDown.Contains( e->X, e->Y ) )
{
// Create custom cursors for the drag-and-drop operation.
try
{
MyNormalCursor = gcnew System::Windows::Forms::Cursor( "3dwarro.cur" );
MyNoDropCursor = gcnew System::Windows::Forms::Cursor( "3dwno.cur" );
}
catch ( Exception^ )
{
// An error occurred while attempting to load the cursors, so use
// the standard cursors.
this->UseCustomCursorsCheck->Checked = false;
}
__finally
{
// The screenOffset is used to account for any desktop bands
// that may be at the top or left side of the screen when
// determining when to cancel the drag drop operation.
screenOffset = SystemInformation::WorkingArea.Location;
// Proceed with the drag-and-drop, passing in the list item.
DragDropEffects dropEffect = this->ListDragSource->DoDragDrop( ListDragSource->Items[ indexOfItemUnderMouseToDrag ], static_cast<DragDropEffects>(DragDropEffects::All | DragDropEffects::Link) );
// If the drag operation was a move then remove the item.
if ( dropEffect == DragDropEffects::Move )
{
ListDragSource->Items->RemoveAt( indexOfItemUnderMouseToDrag );
// Selects the previous item in the list as long as the list has an item.
if ( indexOfItemUnderMouseToDrag > 0 )
ListDragSource->SelectedIndex = indexOfItemUnderMouseToDrag - 1;
else
if ( ListDragSource->Items->Count > 0 )
// Selects the first item.
ListDragSource->SelectedIndex = 0;
}
// Dispose of the cursors since they are no longer needed.
if ( MyNormalCursor != nullptr )
delete MyNormalCursor;
if ( MyNoDropCursor != nullptr )
delete 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;
}
}
void ListDragTarget_DragOver( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ e )
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if ( !e->Data->GetDataPresent( System::String::typeid ) )
{
e->Effect = DragDropEffects::None;
DropLocationLabel->Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ( (e->KeyState & (8 + 32)) == (8 + 32) && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 32) == 32 && ((e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link) )
{
// ALT KeyState for link.
e->Effect = DragDropEffects::Link;
}
else
if ( (e->KeyState & 4) == 4 && ((e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move) )
{
// SHIFT KeyState for move.
e->Effect = DragDropEffects::Move;
}
else
if ( (e->KeyState & 8) == 8 && ((e->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy) )
{
// CTRL KeyState for copy.
e->Effect = DragDropEffects::Copy;
}
else
if ( (e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move )
{
// By default, the drop action should be move, if allowed.
e->Effect = DragDropEffects::Move;
}
else
e->Effect = DragDropEffects::None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop = ListDragTarget->IndexFromPoint( ListDragTarget->PointToClient( Point(e->X,e->Y) ) );
// Updates the label text.
if ( indexOfItemUnderMouseToDrop != ListBox::NoMatches )
{
DropLocationLabel->Text = String::Concat( "Drops before item # ", (indexOfItemUnderMouseToDrop + 1) );
}
else
DropLocationLabel->Text = "Drops at the end.";
}
void ListDragTarget_DragDrop( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ e )
{
// Ensure that the list item index is contained in the data.
if ( e->Data->GetDataPresent( System::String::typeid ) )
{
Object^ item = dynamic_cast<Object^>(e->Data->GetData( System::String::typeid ));
// Perform drag-and-drop, depending upon the effect.
if ( e->Effect == DragDropEffects::Copy || e->Effect == DragDropEffects::Move )
{
// Insert the item.
if ( indexOfItemUnderMouseToDrop != ListBox::NoMatches )
ListDragTarget->Items->Insert( indexOfItemUnderMouseToDrop, item );
else
ListDragTarget->Items->Add( item );
}
}
// Reset the label text.
DropLocationLabel->Text = "None";
}
void ListDragSource_QueryContinueDrag( Object^ sender, System::Windows::Forms::QueryContinueDragEventArgs^ e )
{
// Cancel the drag if the mouse moves off the form.
ListBox^ lb = dynamic_cast<ListBox^>(sender);
if ( lb != nullptr )
{
Form^ f = lb->FindForm();
// Cancel the drag if the mouse moves off the form. The screenOffset
// takes into account any desktop bands that may be at the top or left
// side of the screen.
if ( ((Control::MousePosition.X - screenOffset.X) < f->DesktopBounds.Left) || ((Control::MousePosition.X - screenOffset.X) > f->DesktopBounds.Right) || ((Control::MousePosition.Y - screenOffset.Y) < f->DesktopBounds.Top) || ((Control::MousePosition.Y - screenOffset.Y) > f->DesktopBounds.Bottom) )
{
e->Action = DragAction::Cancel;
}
}
}
void ListDragTarget_DragEnter( Object^ /*sender*/, System::Windows::Forms::DragEventArgs^ /*e*/ )
{
// Reset the label text.
DropLocationLabel->Text = "None";
}
void ListDragTarget_DragLeave( Object^ /*sender*/, System::EventArgs^ /*e*/ )
{
// Reset the label text.
DropLocationLabel->Text = "None";
}
};
}
/// The main entry point for the application.
[STAThread]
int main()
{
Application::Run( gcnew Snip_DragNDrop::Form1 );
}
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Snip_DragNDrop
{
public class Form1 : Form
{
private ListBox ListDragSource;
private ListBox ListDragTarget;
private CheckBox UseCustomCursorsCheck;
private Label DropLocationLabel;
private int indexOfItemUnderMouseToDrag;
private int indexOfItemUnderMouseToDrop;
private Rectangle dragBoxFromMouseDown;
private Point screenOffset;
private Cursor MyNoDropCursor;
private Cursor MyNormalCursor;
// The main entry point for the application.
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
public Form1()
{
this.ListDragSource = new ListBox();
this.ListDragTarget = new ListBox();
this.UseCustomCursorsCheck = new CheckBox();
this.DropLocationLabel = new Label();
this.SuspendLayout();
// ListDragSource
this.ListDragSource.Items.AddRange(new object[] {"one", "two", "three", "four",
"five", "six", "seven", "eight",
"nine", "ten"});
this.ListDragSource.Location = new Point(10, 17);
this.ListDragSource.Size = new Size(120, 225);
this.ListDragSource.MouseDown += this.ListDragSource_MouseDown;
this.ListDragSource.QueryContinueDrag += this.ListDragSource_QueryContinueDrag;
this.ListDragSource.MouseUp += this.ListDragSource_MouseUp;
this.ListDragSource.MouseMove += this.ListDragSource_MouseMove;
this.ListDragSource.GiveFeedback += this.ListDragSource_GiveFeedback;
// ListDragTarget
this.ListDragTarget.AllowDrop = true;
this.ListDragTarget.Location = new Point(154, 17);
this.ListDragTarget.Size = new Size(120, 225);
this.ListDragTarget.DragOver += this.ListDragTarget_DragOver;
this.ListDragTarget.DragDrop += this.ListDragTarget_DragDrop;
this.ListDragTarget.DragEnter += this.ListDragTarget_DragEnter;
this.ListDragTarget.DragLeave += this.ListDragTarget_DragLeave;
// UseCustomCursorsCheck
this.UseCustomCursorsCheck.Location = new Point(10, 243);
this.UseCustomCursorsCheck.Size = new Size(137, 24);
this.UseCustomCursorsCheck.Text = "Use Custom Cursors";
// DropLocationLabel
this.DropLocationLabel.Location = new Point(154, 245);
this.DropLocationLabel.Size = new Size(137, 24);
this.DropLocationLabel.Text = "None";
// Form1
this.ClientSize = new Size(292, 270);
this.Controls.AddRange(new Control[] {
this.ListDragSource,
this.ListDragTarget,
this.UseCustomCursorsCheck,
this.DropLocationLabel});
this.Text = "drag-and-drop Example";
this.ResumeLayout(false);
}
private void ListDragSource_MouseDown(object sender, MouseEventArgs e)
{
// Get the index of the item the mouse is below.
indexOfItemUnderMouseToDrag = ListDragSource.IndexFromPoint(e.X, e.Y);
if (indexOfItemUnderMouseToDrag != ListBox.NoMatches)
{
// Remember the point where the mouse down occurred. The DragSize indicates
// the size that the mouse can move before a drag event should be started.
Size dragSize = SystemInformation.DragSize;
// Create a rectangle using the DragSize, with the mouse position being
// at the center of the rectangle.
dragBoxFromMouseDown = new Rectangle(
new Point(e.X - (dragSize.Width / 2),
e.Y - (dragSize.Height / 2)),
dragSize);
}
else
{
// Reset the rectangle if the mouse is not over an item in the ListBox.
dragBoxFromMouseDown = Rectangle.Empty;
}
}
private void ListDragSource_MouseUp(object sender, MouseEventArgs e)
{
// Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle.Empty;
}
private void ListDragSource_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
// If the mouse moves outside the rectangle, start the drag.
if (dragBoxFromMouseDown != Rectangle.Empty &&
!dragBoxFromMouseDown.Contains(e.X, e.Y))
{
// Create custom cursors for the drag-and-drop operation.
try
{
MyNormalCursor = new Cursor("3dwarro.cur");
MyNoDropCursor = new Cursor("3dwno.cur");
}
catch
{
// An error occurred while attempting to load the cursors, so use
// standard cursors.
UseCustomCursorsCheck.Checked = false;
}
finally
{
// The screenOffset is used to account for any desktop bands
// that may be at the top or left side of the screen when
// determining when to cancel the drag drop operation.
screenOffset = SystemInformation.WorkingArea.Location;
// Proceed with the drag-and-drop, passing in the list item.
DragDropEffects dropEffect = ListDragSource.DoDragDrop(ListDragSource.Items[indexOfItemUnderMouseToDrag], DragDropEffects.All | DragDropEffects.Link);
// If the drag operation was a move then remove the item.
if (dropEffect == DragDropEffects.Move)
{
ListDragSource.Items.RemoveAt(indexOfItemUnderMouseToDrag);
// Selects the previous item in the list as long as the list has an item.
if (indexOfItemUnderMouseToDrag > 0)
ListDragSource.SelectedIndex = indexOfItemUnderMouseToDrag - 1;
else if (ListDragSource.Items.Count > 0)
// Selects the first item.
ListDragSource.SelectedIndex = 0;
}
// Dispose of the cursors since they are no longer needed.
if (MyNormalCursor != null)
MyNormalCursor.Dispose();
if (MyNoDropCursor != null)
MyNoDropCursor.Dispose();
}
}
}
}
private void ListDragSource_GiveFeedback(object sender, 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 ListDragTarget_DragOver(object sender, DragEventArgs e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String)))
{
e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e.KeyState & (8 + 32)) == (8 + 32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// KeyState 8 + 32 = CTRL + ALT
// Link drag-and-drop effect.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link)
{
// ALT KeyState for link.
e.Effect = DragDropEffects.Link;
}
else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
}
else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
// CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy;
}
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
{
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1);
}
else
{
DropLocationLabel.Text = "Drops at the end.";
}
}
private void ListDragTarget_DragDrop(object sender, DragEventArgs e)
{
// Ensure that the list item index is contained in the data.
if (e.Data.GetDataPresent(typeof(System.String)))
{
Object item = e.Data.GetData(typeof(System.String));
// Perform drag-and-drop, depending upon the effect.
if (e.Effect == DragDropEffects.Copy ||
e.Effect == DragDropEffects.Move)
{
// Insert the item.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches)
ListDragTarget.Items.Insert(indexOfItemUnderMouseToDrop, item);
else
ListDragTarget.Items.Add(item);
}
}
// Reset the label text.
DropLocationLabel.Text = "None";
}
private void ListDragSource_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
// Cancel the drag if the mouse moves off the form.
ListBox lb = sender as ListBox;
if (lb != null)
{
Form f = lb.FindForm();
// Cancel the drag if the mouse moves off the form. The screenOffset
// takes into account any desktop bands that may be at the top or left
// side of the screen.
if (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left) ||
((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) ||
((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) ||
((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom))
{
e.Action = DragAction.Cancel;
}
}
}
private void ListDragTarget_DragEnter(object sender, DragEventArgs e)
{
// Reset the label text.
DropLocationLabel.Text = "None";
}
private void ListDragTarget_DragLeave(object sender, EventArgs e)
{
// Reset the label text.
DropLocationLabel.Text = "None";
}
}
}
Imports System.Drawing
Imports System.Windows.Forms
Public NotInheritable Class Form1
Inherits Form
Friend WithEvents ListDragSource As ListBox
Friend WithEvents ListDragTarget As ListBox
Friend WithEvents UseCustomCursorsCheck As CheckBox
Friend WithEvents DropLocationLabel As Label
Private indexOfItemUnderMouseToDrag As Integer
Private indexOfItemUnderMouseToDrop As Integer
Private dragBoxFromMouseDown As Rectangle
Private screenOffset As Point
Private MyNoDropCursor As Cursor
Private MyNormalCursor As Cursor
<STAThread()>
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
Public Sub New()
MyBase.New()
Me.ListDragSource = New ListBox()
Me.ListDragTarget = New ListBox()
Me.UseCustomCursorsCheck = New CheckBox()
Me.DropLocationLabel = New Label()
Me.SuspendLayout()
' ListDragSource
Me.ListDragSource.Items.AddRange(New Object() {"one", "two", "three", "four",
"five", "six", "seven", "eight",
"nine", "ten"})
Me.ListDragSource.Location = New Point(10, 17)
Me.ListDragSource.Size = New Size(120, 225)
' ListDragTarget
Me.ListDragTarget.AllowDrop = True
Me.ListDragTarget.Location = New Point(154, 17)
Me.ListDragTarget.Size = New Size(120, 225)
' UseCustomCursorsCheck
Me.UseCustomCursorsCheck.Location = New Point(10, 243)
Me.UseCustomCursorsCheck.Size = New Size(137, 24)
Me.UseCustomCursorsCheck.Text = "Use Custom Cursors"
' DropLocationLabel
Me.DropLocationLabel.Location = New Point(154, 245)
Me.DropLocationLabel.Size = New Size(137, 24)
Me.DropLocationLabel.Text = "None"
' Form1
Me.ClientSize = New Size(292, 270)
Me.Controls.AddRange(New Control() {Me.ListDragSource,
Me.ListDragTarget,
Me.UseCustomCursorsCheck,
Me.DropLocationLabel})
Me.Text = "drag-and-drop Example"
Me.ResumeLayout(False)
End Sub
Private Sub ListDragSource_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ListDragSource.MouseDown
' Get the index of the item the mouse is below.
indexOfItemUnderMouseToDrag = ListDragSource.IndexFromPoint(e.X, e.Y)
If (indexOfItemUnderMouseToDrag <> ListBox.NoMatches) Then
' Remember the point where the mouse down occurred. The DragSize indicates
' the size that the mouse can move before a drag event should be started.
Dim dragSize As Size = SystemInformation.DragSize
' Create a rectangle using the DragSize, with the mouse position being
' at the center of the rectangle.
dragBoxFromMouseDown = New Rectangle(
New Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)),
dragSize)
Else
' Reset the rectangle if the mouse is not over an item in the ListBox.
dragBoxFromMouseDown = Rectangle.Empty
End If
End Sub
Private Sub ListDragSource_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ListDragSource.MouseUp
' Reset the drag rectangle when the mouse button is raised.
dragBoxFromMouseDown = Rectangle.Empty
End Sub
Private Sub ListDragSource_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ListDragSource.MouseMove
If ((e.Button And MouseButtons.Left) = MouseButtons.Left) Then
' If the mouse moves outside the rectangle, start the drag.
If (Rectangle.op_Inequality(dragBoxFromMouseDown, Rectangle.Empty) And
Not dragBoxFromMouseDown.Contains(e.X, e.Y)) Then
' Creates custom cursors for the drag-and-drop operation.
Try
MyNormalCursor = New Cursor("3dwarro.cur")
MyNoDropCursor = New Cursor("3dwno.cur")
Catch
' An error occurred while attempting to load the cursors so use
' standard cursors.
UseCustomCursorsCheck.Checked = False
Finally
' The screenOffset is used to account for any desktop bands
' that may be at the top or left side of the screen when
' determining when to cancel the drag drop operation.
screenOffset = SystemInformation.WorkingArea.Location
' Proceed with the drag-and-drop, passing in the list item.
Dim dropEffect As DragDropEffects = ListDragSource.DoDragDrop(
ListDragSource.Items(indexOfItemUnderMouseToDrag),
DragDropEffects.All Or DragDropEffects.Link)
' If the drag operation was a move then remove the item.
If (dropEffect = DragDropEffects.Move) Then
ListDragSource.Items.RemoveAt(indexOfItemUnderMouseToDrag)
' Select the previous item in the list as long as the list has an item.
If (indexOfItemUnderMouseToDrag > 0) Then
ListDragSource.SelectedIndex = indexOfItemUnderMouseToDrag - 1
ElseIf (ListDragSource.Items.Count > 0) Then
' Selects the first item.
ListDragSource.SelectedIndex = 0
End If
End If
' Dispose the cursors since they are no longer needed.
If (Not MyNormalCursor Is Nothing) Then _
MyNormalCursor.Dispose()
If (Not MyNoDropCursor Is Nothing) Then _
MyNoDropCursor.Dispose()
End Try
End If
End If
End Sub
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 Sub ListDragTarget_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragOver
' Determine whether string data exists in the drop data. If not, then
' the drop effect reflects that the drop cannot occur.
If Not (e.Data.GetDataPresent(GetType(System.String))) Then
e.Effect = DragDropEffects.None
DropLocationLabel.Text = "None - no string data."
Return
End If
' Set the effect based upon the KeyState.
If ((e.KeyState And (8 + 32)) = (8 + 32) And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' KeyState 8 + 32 = CTRL + ALT
' Link drag-and-drop effect.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 32) = 32 And
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' ALT KeyState for link.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 4) = 4 And
(e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' SHIFT KeyState for move.
e.Effect = DragDropEffects.Move
ElseIf ((e.KeyState And 8) = 8 And
(e.AllowedEffect And DragDropEffects.Copy) = DragDropEffects.Copy) Then
' CTRL KeyState for copy.
e.Effect = DragDropEffects.Copy
ElseIf ((e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
' Gets the index of the item the mouse is below.
' The mouse locations are relative to the screen, so they must be
' converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(New Point(e.X, e.Y)))
' Updates the label text.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
DropLocationLabel.Text = "Drops before item #" & (indexOfItemUnderMouseToDrop + 1)
Else
DropLocationLabel.Text = "Drops at the end."
End If
End Sub
Private Sub ListDragTarget_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragDrop
' Ensures that the list item index is contained in the data.
If (e.Data.GetDataPresent(GetType(System.String))) Then
Dim item As Object = CType(e.Data.GetData(GetType(System.String)), System.Object)
' Perform drag-and-drop, depending upon the effect.
If (e.Effect = DragDropEffects.Copy Or
e.Effect = DragDropEffects.Move) Then
' Insert the item.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
ListDragTarget.Items.Insert(indexOfItemUnderMouseToDrop, item)
Else
ListDragTarget.Items.Add(item)
End If
End If
' Reset the label text.
DropLocationLabel.Text = "None"
End If
End Sub
Private Sub ListDragSource_QueryContinueDrag(ByVal sender As Object, ByVal e As QueryContinueDragEventArgs) Handles ListDragSource.QueryContinueDrag
' Cancel the drag if the mouse moves off the form.
Dim lb As ListBox = CType(sender, ListBox)
If (lb IsNot Nothing) Then
Dim f As Form = lb.FindForm()
' Cancel the drag if the mouse moves off the form. The screenOffset
' takes into account any desktop bands that may be at the top or left
' side of the screen.
If (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left) Or
((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) Or
((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) Or
((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom)) Then
e.Action = DragAction.Cancel
End If
End If
End Sub
Private Sub ListDragTarget_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragEnter
' Reset the label text.
DropLocationLabel.Text = "None"
End Sub
Private Sub ListDragTarget_DragLeave(ByVal sender As Object, ByVal e As EventArgs) Handles ListDragTarget.DragLeave
' Reset the label text.
DropLocationLabel.Text = "None"
End Sub
End Class
Následující příklad kódu ukazuje, jak pomocí výčtu DragDropEffects určit, jak se mají data přenášet mezi ovládacími prvky zahrnutými do operace přetažení. Tento příklad vyžaduje, aby formulář obsahoval RichTextBox ovládací prvek a ListBox ovládací prvek a aby ListBox byl ovládací prvek naplněn seznamem platných názvů souborů. Když uživatel přetáhne název souboru do RichTextBox ovládacího prvku, vyvolá se DragEnter událost ovládacího prvku. V rámci obslužné rutiny Effect události je vlastnost DragEventArgs inicializována, DragDropEffects aby bylo možné inicializovat data, na která odkazuje cesta k souboru, do RichTextBox ovládacího prvku.
private:
void Form1_Load( Object^ /*sender*/, EventArgs^ /*e*/ )
{
// Sets the AllowDrop property so that data can be dragged onto the control.
richTextBox1->AllowDrop = true;
// Add code here to populate the ListBox1 with paths to text files.
}
void listBox1_MouseDown( Object^ sender, System::Windows::Forms::MouseEventArgs^ e )
{
// Determines which item was selected.
ListBox^ lb = (dynamic_cast<ListBox^>(sender));
Point pt = Point(e->X,e->Y);
int index = lb->IndexFromPoint( pt );
// Starts a drag-and-drop operation with that item.
if ( index >= 0 )
{
lb->DoDragDrop( lb->Items[ index ], DragDropEffects::Link );
}
}
void richTextBox1_DragEnter( Object^ /*sender*/, DragEventArgs^ e )
{
// If the data is text, copy the data to the RichTextBox control.
if ( e->Data->GetDataPresent( "Text" ) )
e->Effect = DragDropEffects::Copy;
}
void richTextBox1_DragDrop( Object^ /*sender*/, DragEventArgs^ e )
{
// Loads the file into the control.
richTextBox1->LoadFile( dynamic_cast<String^>(e->Data->GetData( "Text" )), System::Windows::Forms::RichTextBoxStreamType::RichText );
}
private void Form1_Load(object sender, EventArgs e)
{
// Sets the AllowDrop property so that data can be dragged onto the control.
richTextBox1.AllowDrop = true;
// Add code here to populate the ListBox1 with paths to text files.
}
private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
// Determines which item was selected.
ListBox lb =( (ListBox)sender);
Point pt = new Point(e.X,e.Y);
int index = lb.IndexFromPoint(pt);
// Starts a drag-and-drop operation with that item.
if(index>=0)
{
lb.DoDragDrop(lb.Items[index].ToString(), DragDropEffects.Link);
}
}
private void richTextBox1_DragEnter(object sender, DragEventArgs e)
{
// If the data is text, copy the data to the RichTextBox control.
if(e.Data.GetDataPresent("Text"))
e.Effect = DragDropEffects.Copy;
}
private void richTextBox1_DragDrop(object sender, DragEventArgs e)
{
// Loads the file into the control.
richTextBox1.LoadFile((String)e.Data.GetData("Text"), System.Windows.Forms.RichTextBoxStreamType.RichText);
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Sets the AllowDrop property so that data can be dragged onto the control.
RichTextBox1.AllowDrop = True
' Add code here to populate the ListBox1 with paths to text files.
End Sub
Private Sub RichTextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles RichTextBox1.DragEnter
' If the data is text, copy the data to the RichTextBox control.
If (e.Data.GetDataPresent("Text")) Then
e.Effect = DragDropEffects.Copy
End If
End Sub
Private Overloads Sub RichTextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles RichTextBox1.DragDrop
' Loads the file into the control.
RichTextBox1.LoadFile(e.Data.GetData("Text"), System.Windows.Forms.RichTextBoxStreamType.RichText)
End Sub
Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown
Dim Lb As ListBox
Dim Pt As New Point(e.X, e.Y)
Dim Index As Integer
' Determines which item was selected.
Lb = sender
Index = Lb.IndexFromPoint(Pt)
' Starts a drag-and-drop operation with that item.
If Index >= 0 Then
Lb.DoDragDrop(Lb.Items(Index), DragDropEffects.Link)
End If
End Sub
Poznámky
Parametr allowedEffects
určuje, ke kterým operacím přetažení může dojít. Pokud operace přetažení potřebuje spolupracovat s aplikacemi v jiném procesu, data by měla být buď základní spravovaná třída (String, Bitmapnebo Metafile), nebo objekt, který implementuje ISerializable nebo IDataObject.
Následující článek popisuje, jak a kdy jsou vyvolány události související s operacemi přetahování.
Metoda DoDragDrop určuje ovládací prvek pod aktuálním umístěním kurzoru. Pak zkontroluje, jestli je ovládací prvek platným cílem přetažení.
Pokud je ovládací prvek platným cílem přetažení, GiveFeedback událost je vyvolána se zadaným efektem přetažení. Seznam efektů přetažení najdete ve výčtu DragDropEffects .
Změny v pozici kurzoru myši, stavu klávesnice a stavu tlačítka myši se sledují.
Pokud se uživatel přesune z okna, DragLeave událost se vyvolá.
Pokud myš přejde do jiného ovládacího prvku, DragEnter je aktivována hodnota pro tento ovládací prvek.
Pokud se myš přesune, ale zůstane ve stejném ovládacím DragOver prvku, vyvolá se událost.
Pokud dojde ke změně stavu tlačítka klávesnice nebo myši, QueryContinueDrag událost je vyvolána a určuje, zda pokračovat v přetažení, odstranit data nebo zrušit operaci na základě hodnoty Action vlastnosti události QueryContinueDragEventArgs.
Pokud je
Continue
hodnota DragAction , DragOver událost se vyvolá, aby operace pokračovala, a GiveFeedback událost se vyvolá s novým efektem, aby bylo možné nastavit odpovídající vizuální zpětnou vazbu. Seznam platných efektů přetažení najdete ve výčtu DragDropEffects .Poznámka
DragOver Události a GiveFeedback se spárují tak, že když se myš přesune přes cíl přetažení, dostane uživatel nejaktuálnější zpětnou vazbu ohledně pozice myši.
Pokud je
Drop
hodnota DragAction hodnota , vrátí se zdroji hodnota efektu poklesu, aby zdrojová aplikace mohl se zdrojovými daty provést příslušnou operaci, například vyjmout data, pokud se operace provedla přesunem.Pokud je
Cancel
hodnota , DragActionDragLeave událost se vyvolá.
Poznámka
Metoda DoDragDrop zachytává všechny výjimky a znovu vyvolá pouze následující výjimky zabezpečení nebo kritické výjimky:
Securityexception
Nullreferenceexception
Stackoverflowexception
Outofmemoryexception
Threadabortexception
Výjimka ExecutionEngineException
Výjimka IndexOutOfRangeException
AccessViolationException
Viz také
Platí pro
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro