Программирование операции перетаскивания для вставки объектов
OLE-операции Drag-and-Drop (Перетащить-и-опустить) удобнее задавать в тексте программы, а не определять автоматически. Проект OLEDDMAN (папка OLEDD на компакт-диске) имеет тот же интерфейс, что и проект OLEDDAUTO, но в нем установлено значение Manual свойства OLEDropMode. Значение своиства OLEDragMode элемента управления TextBox установлено в Automatic, поэтому для инициализации операции писать программу не требуется. То же относится и к элементам управления RichTextBox и PictureBox.
Каждый из элементов управления определяет, когда на него опущен объект, и реагирует соответствующим образом. Рассмотрим самый простой элемент управления — TextBox. Когда на него опущен объект, происходит событие OLEDragDrop, эквивалентное событию DragDrop. Событие OLEDragDrop определяется следующим образом:
Private Sub Textl_OLEDragDrop^(Data As Data0b]ect, _
Effect As Long, Button As Integer, Shift As Integer, _
x As Single, у As Single)
Data - это переменная, описывающая объект, который был опущен. Эта переменная имеет несколько свойств для доступа к объекту (они рассматриваются вкратце). Effect — константа, которая определяет тип перемещения (операция Move или Copy). Параметр Button
описывает кнопку, щелчок на которой инициализирует операцию помещения объекта; параметр Shift
содержит информацию о состоянии клавиш управления Shift, Alt и Ctrl. Последние два параметра - координаты точки, в которую помещается скопированный или перемещенный объект.
Методы, применяемые при работе с объектами типа Data подобны методам, используемым при работе с буфером обмена Clipboard. Метод GetFormat позволяет определить формат данных. При этом он не возвращает тип данных. При его вызове необходимо указывать предполагаемый тип данных, и если он соответствует указанному, то возвращается значение True, в противном случае — False. Чтобы выяснить, содержит ли объект Data текст, следует воспользоваться следующим оператором If:
If Data.GetFormat(vbCFText) Then
{обработка текста}
End If
(Константы, описывающие различные типы данных, точно такие же, как и используемые при работе с буфером обмена.)
Чтобы получить сами данные, следует использовать метод GetData. Этот метод возвращает объект, который должен быть присвоен соответствующей переменой. Если данные являются текстом, можно присвоить значение, возвращенное методом GetData, свойству Text элемента управления TextBox. Если данные — растровое изображение, то можно присвоить их свойству Picture того элемента управления, который может выводить изображение.
Синтаксис метода GetData имеет вид:
Data.GetData(format)
где
formal — константа, которая определяет желаемый формат данных. Один и тот же объект может иметь различные форматы. Выделив абзац из документа Word, можно поместить его в окно элемента управления TextBox как текст, а в окно элемента управления RichTextBox - как сформатированный текст. Данные как таковые могут быть восстановлены во множественных форматах, в зависимости от возможностей элемента-получателя. Метод EditCopy элемента управления Graph работает точно так же (рассматривается в Приложении В "The MSChart Control" ("Элемент управления MSChart")). Он копирует текущее изображение из окна элемента управления Graph. Эти данные могут быть вставлены либо как растровое изображение в рабочее окно графического редактора, или как текст — в окно текстового редактора.
Если пользователь поместил один или несколько файлов на элемент управления (значение выражения GetFotmat(vbCFFiles)
равно True), можно воспользоваться семейством Files объекта Data, чтобы получить названия этих файлов:
If Data.GetFormat(vbCFFiles) Then
For i = 1 To Data.Files.Count
{обработка файла Data.Files(i)) }
Next
End If
Ниже приводится текст обработчика OLE — операции перетащить-и-опустить для окна элемента управления TextBox:
Private Sub Textl_OLEDragDrop(Data As Data0b]ect, _
Effect As Long, Button As Integer, Shift As Integer, _
x As Single, у As Single)
Dim pie As Picture
If Data GetFormat(vbCFFlles) Then
Text1.Text "You dropped the following files " & vbCrLf
' (Вы поместили следующие файлы)
For i = 1 To Data Files Count
Textl.Text = Textl Text & Data.Files(i) & vbCrLf
Next
End If
If Data.GetFormat(vbCFRTF) Then
Text1.Text = Data.GetData(vbCFText)
End If
If Data GetFormat(vbCFBitmap) Then
imgWidth = Round(ScaleX(Data GetData _
(vbCFBitmap).Width, vbHimetric, vbPixels))
imgHeight - Round(ScaleY(Data GetData _
(vbCFBitmap) Height, vbHimetric, vbPixels))
Textl.Text = " You dropped an image with the folowing _
specifications:" & vbCrLf
' (Вы поместили изображение со следующими параметрами:)
Text1.Text = Textl.Text & "WIDTH " & imgWidth & vbCrLf
Text1.Text = Textl.Text & "HEIGHT " & imgHeight
End If
Если поместить один или несколько файлов в окно элемента управления TextBox, то будут перечислены их имена. Если вы перетащили текст из элемента управления RichTextBox, то этот же самый текст появится в окне элемента TextBox не отформатированным. И, наконец, если поместить в TextBox изображение из элемента управления PictureBox, то будут выведены характеристики изображения. Следует обратить внимание на то, как программа передает размеры изображения. Объект, полученный в результате применения метода GetData, является объектом типа Picture, следовательно, можно обратиться к его свойствам Width и Height, чтобы получить значения размеров объекта.
Текст обработчика события OLEDragDrop элемента управления RichTextBox напоминает фрагмент, приведенный выше. Однако элемент управления RichTextBox воспринимает большее количество типов данных и реагирует на них по-разному Можно открыть соответствующий проект в Visual Basic и исследовать текст программы. Если попытаться поместить изображение в окно элемента управления RichTextBox, то в результате будет получено сообщение об ошибке. Следующий фрагмента программы должен бы выполнить вставку растрового изображения в RichTextBox, но этого не происходит. Во время выполнения программы вместо перемещения изображения выдается сообщение об ошибке.
If Data.GetFormat(vbCFBitmap) Or Data.GetFormat(vbCFDIB) Then
RichTextBox1.OLEObjects.Add, , Data.GetData(vbCFDIB)
GoTo PasteDone
End If
Единственный выход из данной ситуации который можно предложить - на мгновение переключить свойство OLEDropMode элемента управления RichTextBox в состояние Automatic, а затем вернуть его в состояние Manual. Первое действие должно происходить в обработчике события OLEStartDrag элемента управления PictureBox.
Private Sub Picture1_OLEStartDrag(Data As Data0bject, _
AllowedEffects As Long)
RichTextBox1.OLEDropMode = rtfOLEDropAutomatic
End Sub
После того как операция переноса завершена можно установить исходное значение свойства OLEDropMode элемента управления. Это действие должно выполняться в обработчике события OLECompleteDrag элемента управления TextBox, которое сигнализирует об окончании OLE-операции перетащить-и-опустить:
Private Sub Picture1.OLECopmpleteDrag(Effect As Long)
RichTextBox1.OLEDropMode = rtfOLEDropManual
End Sub
OLE-операции перетащить и-опустить аналогичны обычным операциям такого типа но они могут быть несколько более сложными из-за разнообразия объектов, которые могут переносить. Получатель (элемент управления) должен быть в состоянии распознать тип переносимого объекта, чтобы обработать его. Способность обнаруживать перемещение файлов на форму Visual Basic означает, что вы можете создавать приложения, которые способны взаимодействовать с рабочим столом (получать файлы, помещенные пользователем, обрабатывать их, перемещать их в различные папки и т. п.). OLE операции перетащить-и-опустить — очень интересная возможность, которую в дальнейшем, вы можете изучить самостоятельно, обратившись к справочной системе Visual Basic.