Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Возвращаемое значение





Тип: System.Windows.Forms.DragDropEffects
Значение перечисления DragDropEffects, представляющее конечный результат выполнения операции перетаскивания.

Заметки

Параметр allowedEffects определяет, какие операции перетаскивания возможны. Если операции перетаскивания требуется взаимодействие с приложениями в другом процессе, данные должны быть либо экземпляром базового управляемого класса (String, Bitmap или Metafile), либо объектом, реализующим ISerializable или IDataObject.

Далее описывается, как и когда вызываются события, связанные с операциями перетаскивания.

Метод DoDragDrop определяет элемент управления при текущем местоположении курсора. Затем он проверяет, является ли элемент управления допустимым для конечного местоположения объекта перетаскивания.

Если элемент управления является допустимым для конечного местоположения объекта перетаскивания, вызывается событие GiveFeedback с указанным эффектом перетаскивания. Список эффектов перетаскивания см. в перечислении DragDropEffects.

Отслеживаются изменения позиции курсора мыши, состояния клавиатуры и кнопки мыши.

· Если пользователь перемещает курсор мыши за пределы окна, происходит событие DragLeave.

· Если курсор мыши перемещается на другой элемент управления, для этого элемента вызывается событие DragEnter.

· При перемещении мыши в пределах одного элемента управления происходит событие DragOver.

При изменении состояния клавиатуры или кнопки мыши происходит событие QueryContinueDrag, определяющее, следует ли продолжить или завершить перетаскивание либо отменить операцию на основании значения свойства Action аргумента QueryContinueDragEventArgs данного события.

· Если значение объекта DragAction равно Continue, возникает событие DragOver, чтобы продолжить операцию, и событие GiveFeedback с новым эффектом, что позволяет задать соответствующую визуальную обратную связь. Список допустимых эффектов перетаскивания см. в перечислении DragDropEffects.

Примечание
События DragOver и GiveFeedback объединены в пару, чтобы при перемещении мыши над конечным местоположением перетаскивания отображались самые последние сведения о расположении мыши.

· Если значение DragAction равно Drop, значение эффекта перетаскивания возвращается источнику, благодаря чему исходное приложение может выполнить соответствующую операцию с исходными данными (например, вырезать данные, если это была операция перемещения).

· Если значение DragAction равно Cancel, происходит событие DragLeave.

Примечание
Метод DoDragDrop фиксирует все исключения и отображает повторно только следующие исключения безопасности или критические исключения:

· SecurityException

· NullReferenceException

· StackOverflowException

· OutOfMemoryException

· ThreadAbortException

· ExecutionEngineException

· IndexOutOfRangeException

· AccessViolationException

Примеры

В следующем примере кода показана операция перетаскивания между двумя элементами управления ListBox. В примере во время запуска действия перетаскивания вызывается метод DoDragDrop. Действие перетаскивания начинается, если во время события MouseDown мышь сместилась относительно своего положения больше чем на SystemInformation.DragSize. Метод IndexFromPoint применяется для определения индекса элемента, перетаскиваемого во время события MouseDown.

В этом примере также показывается использование пользовательских курсоров для операции перетаскивания. В данном примере требуется, чтобы в каталоге приложения имелось два файла курсоров: 3dwarro.cur и 3dwno.cur — первый для пользовательского курсора перетаскивания, а второй для курсора с запрещенным перетаскиванием. Пользовательские курсоры используются, если установлен флажок CheckBoxUseCustomCursorsCheck.Пользовательские курсоры задаются в обработчике событий GiveFeedback.

Состояние клавиатуры проверяется в обработчике события DragOver для правого элемента ListBox, чтобы на основании состояния клавиш SHIFT, CTRL, ALT или сочетания клавиш CTRL+ALT определить, какая операция перетаскивания будет выполнена. Расположение в элементе управления ListBox, куда будет перемещен объект, также определяется во время события DragOver. Если перетаскиваемые данные не относятся к типу String, для свойства DragEventArgs.Effect задается значение None в объекте DragDropEffects. Наконец, состояние перетаскивания отображается в объектеLabelDropLocationLabel.

Данные, перетаскиваемые в правый элемент управления ListBox, определяются в обработчике событий DragDrop, и значение типа String добавляется в соответствующее место списка ListBox. Если перетаскиваемый объект перемещается за пределы формы, то операция перетаскивания отменяется в обработчике событий QueryContinueDrag.


C#

C++

VB

using System;using System.Drawing;using System.Windows.Forms; namespace Snip_DragNDrop{ public class Form1: System.Windows.Forms.Form { private System.Windows.Forms.ListBox ListDragSource; private System.Windows.Forms.ListBox ListDragTarget; private System.Windows.Forms.CheckBox UseCustomCursorsCheck; private System.Windows.Forms.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 System.Windows.Forms.ListBox(); this.ListDragTarget = new System.Windows.Forms.ListBox(); this.UseCustomCursorsCheck = new System.Windows.Forms.CheckBox(); this.DropLocationLabel = new System.Windows.Forms.Label(); this.SuspendLayout(); // ListDragSource this.ListDragSource.Items.AddRange(new object[] {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}); this.ListDragSource.Location = new System.Drawing.Point(10, 17); this.ListDragSource.Size = new System.Drawing.Size(120, 225); this.ListDragSource.MouseDown += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseDown); this.ListDragSource.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.ListDragSource_QueryContinueDrag); this.ListDragSource.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseUp); this.ListDragSource.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ListDragSource_MouseMove); this.ListDragSource.GiveFeedback += new System.Windows.Forms.GiveFeedbackEventHandler(this.ListDragSource_GiveFeedback); // ListDragTarget this.ListDragTarget.AllowDrop = true; this.ListDragTarget.Location = new System.Drawing.Point(154, 17); this.ListDragTarget.Size = new System.Drawing.Size(120, 225); this.ListDragTarget.DragOver += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragOver); this.ListDragTarget.DragDrop += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragDrop); this.ListDragTarget.DragEnter += new System.Windows.Forms.DragEventHandler(this.ListDragTarget_DragEnter); this.ListDragTarget.DragLeave += new System.EventHandler(this.ListDragTarget_DragLeave); // UseCustomCursorsCheck this.UseCustomCursorsCheck.Location = new System.Drawing.Point(10, 243); this.UseCustomCursorsCheck.Size = new System.Drawing.Size(137, 24); this.UseCustomCursorsCheck.Text = "Use Custom Cursors"; // DropLocationLabel this.DropLocationLabel.Location = new System.Drawing.Point(154, 245); this.DropLocationLabel.Size = new System.Drawing.Size(137, 24); this.DropLocationLabel.Text = "None"; // Form1 this.ClientSize = new System.Drawing.Size(292, 270); this.Controls.AddRange(new System.Windows.Forms.Control[] {this.ListDragSource, this.ListDragTarget, this.UseCustomCursorsCheck, this.DropLocationLabel}); 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 = 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, System.Windows.Forms.MouseEventArgs e) { // Reset the drag rectangle when the mouse button is raised. dragBoxFromMouseDown = Rectangle.Empty; } private 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 = 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, 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 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(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 = CTL + 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) { // CTL 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, System.Windows.Forms.DragEventArgs e) { // Ensure that the list item index is contained in the data. if (e.Data.GetDataPresent(typeof(System.String))) { Object item = (object)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, System.Windows.Forms.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, System.Windows.Forms.DragEventArgs e) { // Reset the label text. DropLocationLabel.Text = "None"; } private void ListDragTarget_DragLeave(object sender, System.EventArgs e) { // Reset the label text. DropLocationLabel.Text = "None"; } }}

В следующем примере кода показано использование перечисления DragDropEffects для задания способа передачи данных между элементами управления, вовлеченными в операцию перетаскивания. В данном примере требуется наличия формы, включающей элементы управления RichTextBoxи ListBox, а также элемента управления ListBox, заполненного списком допустимых имен файлов. При перетаскивании имени файла на элемент управления RichTextBox происходит событие DragEnter элемента управления. В обработчике событий свойство Effect объекта DragEventArgsинициализируется в объекте DragDropEffects, чтобы указать, что данные, на которые ссылается путь файла, следует скопировать в элемент управленияRichTextBox.



C#

C++

VB

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);}

Сведения о версии







Date: 2015-05-22; view: 510; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию