Студопедия

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

Разделы сайта

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






If Data.GetFormat(vbCFDIB) Then .






Теперь далее. Если наш формат правильный, то мы можем загрузить картинку, используя метод GetData для все того же объекта DataObject. Метод GetData возвращает данные объекта DataObject в установленном формате. Обратный ему метод SetData устанавливает данные в нужном формате объекта DataObject.
Синтаксис этих методов аналогичен синтаксису метода GetFormat:

объект.GetData (format)
объект.SetData данные, format

где
объект
- это наш объект DataObject
данные
- это то, что мы будем перетаскивать.
format
- это константа, указывающая на формат объекта и может принимать те же значения, что и для метода GetFormat.

Теперь, собственно, загрузка нашей картинки будет выглядеть так:
Picture1.Picture = Data.GetData(vbCFDIB)
Кроме того, мы можем использовать параметр effect процедуры _OLEDragDrop для определения характеристики перетаскивания: копирования, переноса или ничего.

Effect = vbDropEffectCopy 'например для копирования

Но надо сказать, что поскольку пакет данных для перетаскивания готовился в объекте-источнике в неизвестном нам приложении, то толку от использования этого параметра будет мало. Т.е. вообще не будет. Этот параметр сообщает в объект-источник, какое действие было выполнено. Но объект источник-то - в чужом приложении и ему в большей степени наплевать на наш параметр. Этот параметр сработает, если только второе приложение - тоже создавалось нами и для его объекта-источника определены соответствующие процедуры. Но мы все-таки оставим этот оператор для, так сказать, чистоты эксперимента. В результате наша процедура будет такая:

 

Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Data.GetFormat(vbCFDIB) Then
Picture1.Picture = Data.GetData(vbCFDIB)
Effect = vbDropEffectCopy
End If
End Sub

Как видишь все на самом деле просто. У нас еще осталось неиспользованое событие _OLEDragOver. С его помощью и с помощью параметра Effect мы можем управлять курсором мыши. В зависимости от параметра Effect курсор мыши может иметь следующий вид:

Effect = vbDropEffectNone
Effect = vbDropEffectCopy
Effect = vbDropEffectMove

Для курсора копирования мы можем записать такую процедурку:

Private Sub Picture1_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
Effect = vbDropEffectCopy
End Sub

Надо сказать, что все прочие параметры события _OLEDragOver имеют контрольный характер и нас не интересуют. Хотя, отслеживая значение параметра State мы можем подгружать изображение нужных нам курсоров (если есть желание), как мы делали в прошлой, 18-й главе.
Теперь можно перетаскивать картинку из того же Photoshopa в наш проект. Но, например, перетащить из ACDSee (из окна превьюшек) не удастся из-за несовместимости форматов.
А сейчас давай напишем две аналогичные процедурки для перетаскивания текста в Text1. Суть их совершенно та же. В качестве формата объекта возьмем константу vbCFText.

Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Data.GetFormat(vbCFText) Then
Text1.SelText = Data.GetData(vbCFText)
Effect = vbDropEffectCopy
End If
End Sub

Private Sub Text1_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
Effect = vbDropEffectCopy
End Sub

Теперь, если мы выделим в чужом окне, например, хоть окне кода того же Basic'а кусочек строки, то его можно будет перетянуть в Text1. Единственное, что я хочу заметить, мы в качестве свойства Text1 использовали незнакомое нам свойство .SelText. Мы могли бы использовать и свойство .Text, но тогда вставляемый текст просто заменял бы уже существующий. А с использованием свойства .SelText мы можем вставлять фрагмент текста в уже существующий текст в любое место. Подробней это и сопутствующие ему свойства рассмотрены в следующей 20-й главе.

Итак, как видите, ничего сложного, больше пугающих таблиц со свойствами и константами, чем строк кода.
А теперь также радостно попробуем создать на нашей форме объекты-источники и перетащить наши данные в чужое приложение. Сперва мы изменим процедуру Form_Load. В ней мы добавим две строчки для инициализации Picture1 и Text1 как объекты-источники и заполним их данными и будет это выглядеть так:

Private Sub Form_Load()
Picture1.OLEDropMode = vbOLEDropManual
Picture1.OLEDragMode = vbOLEDragManual
Text1.OLEDropMode = vbOLEDropManual
Text1.OLEDragMode = vbOLEDropManual
Picture1 = LoadPicture(App.Path & " \images_07.jpg")
Text1 = " Visual Basic - это не просто просто, а очень просто"
End Sub

Обрати внимание, что я не писал свойство .Text у Text1 и свойство .Picture у объекта Picture1. Дело в том, что это главные свойства этих объектов и понимаются VB по умолчанию (как, например, .Capture у Label и т.д.) и писать их нет никакой необходимости. Так же я буду поступать и далее.

Напишем необходимые процедуры для источника перетаскивания - Text1. Для того, чтобы начать перетаскивание, используется метод OLEDrag. Он не имеет аргументов и просто начинает перетаскивание. Его удобно поставить в процедуру _MouseMove или _MouseDown, которые позволят отследить нажатие левой кнопки мыши (ведь при нажатой левой кнопке мыши мы и осуществляем перетаскивание):

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then 'если нажата левая кнопка мыши
Text1.OLEDrag 'включаем перетаскивание

End If
End Sub

При запуске метода OLEDrag возникает событие _OLEStartDrag, которое позволяет нам сформировать данные для объекта-приемника. Данные эти надо поместить в объект DataObject с помощью метода SetData. Так же, с помощью параметра AllowedEffects мы можем определить порядок перетаскивания (копирование или перемещение):

Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
AllowedEffects = vbDropEffectCopy Or vbDropEffectMove
Data.Clear 'очистка DataObject
Data.SetData Text1, vbCFText 'заполнение DataObject данными

End Sub

Обрати внимание, что если нам надо включить в DataObject несколько форматов, это достигается повторным вызовом метода .SetData каждый раз с новым форматом. Поэтому, чтобы гарантировать, что у нас нет ранее вызванных форматов, перед первым вызовом объект DataObject очищается с помощью метода Clear.

Мы можем использовать тот вид курсора, который нам захочется. Сделать это можно в процедуре события _OLEGiveFeedback, в зависимости от значения его параметра Effect. Для этого используется объект Screen и его свойства .MousePointer и .MouseIcon:

Private Sub Text1_OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean)
'убираем курсор по-умолчанию
DefaultCursors = False
'включаем пользовательский курсор
Screen.MousePointer = vbCustom
'в зависимости от параметра Effect подгружаем нужные нам иконки

If Effect = vbDropEffectNone Then
Screen.MouseIcon = LoadPicture(App.Path & " \No.ico")
ElseIf vbDropEffectMove And Effect Then
Screen.MouseIcon = LoadPicture(App.Path & " \Move.ico")
ElseIf vbDropEffectCopy And Effect Then
Screen.MouseIcon = LoadPicture(App.Path & " \Yes.ico")
End If
End Sub

После окончания перетаскивания для объекта-источника возникает событие _OLECompleteDrag. В этой процедуре мы можем очиститьText1, если перетаскивание было перемещением, а не копированием и кроме того, надо обязательно вернуть курсор к виду, который у него был до начала перетаскивания.

Private Sub Text1_OLECompleteDrag(Effect As Long)
'проверка состояния Effect
If vbDropEffectMove And Effect Then Text1 = " "
'восстановление курсора по-умолчанию
Screen.MousePointer = vbDefault
End Sub

Обратите внимание, что проверка константы vbDropEffectMove осуществляется не так, как можно было бы предположить, исходя из здравого смысла, а именно: If Effect = vbDropEffectMove..., а маскируется с помощью логической операции And. В полном виде это выглядело бы так:
If Effect and vbDropEffectMove = vbDropEffectMove, мы в программе использовали сокращенный аналог. Делается это для совместимости с будущими версиями VB, хотя с появлением VB Net это, наверное, неактуально.
Вот в основном и все. Теперь ты можешь перетащить текст из Text1 в другое приложение, например Word. Процедуры для перетаскивания из Picture1 абсолютно аналогичны и приведены в коде примера " OLEDrag.zip", который можно скачать вверху страницы.

 

 

В Visual Basic существуют объекты, не отображаемые на форме, но использование которых несложно и может принести некоторую пользу. В прошлых главах мы говорили об объектах Printer, Err и DataObject. Давайте поговорим еще о парочке.

Объект Screen.

По-сути, объект Screen представляет собой весь экран или иначе Десктоп (DeskTop). Как и другие объекты, объект Screen имеет определенные свойства. Так, например, почему-то считается, что для определения разрешения экрана надо использовать API-функции. Но это прекрасно можно сделать и внутренними возможностями VB. У объекта Screen есть свойства .Height и .Width, которые и возвращают высоту и ширину экрана в твипах. Эти самые твипы легко преобразовать в пиксели, если использовать два других свойства объекта Screen - .TwipsPerPixelX (которое возвращает количество твипов в пикселе по-горизонтали) и .TwipsPerPixelY (которое возвращает количество твипов в пикселе по-вертикали). Таким образом, чтобы определить разрешение экрана, мы пишем приблизительно следующий код:

Private Sub Command1_Click()
'Объявить переменные
Dim VisotaScr As Long 'для высоты
Dim ShirinaScr As Long 'для ширины
VisotaScr = Screen.Height / Screen.TwipsPerPixelX 'узнаем ширинуэкрана и преобразовываем ее в пиксели
ShirinaScr = Screen.Width / Screen.TwipsPerPixelY 'узнаем высоту экрана и преобразовываем ее в пиксели
Text1 = VisotaScr & " x " & ShirinaScr 'выводим результат в Text1

End Sub

Еще одно свойство .ActiveControl содержит ссылку на элемент управления (и его свойства), имеющий фокус. Смысл использования этого свойства следующий. Например, у тебя на формe три текстбокса. И ты хочешь активный текстбокс очистить. Вот в этом случае и можно использовать свойство .ActiveControl, например

Screen.ActiveControl.Text=" "

т. е. очищается тот объект (в нашем случае TextBox), на котором в данный момент находится фокус. Это, конечно, несколько упрощено, поскольку, во-первых, необходимо проверить, а текстбокс ли это? Может у тебя на форме есть другие элементы, например, PictureBox. Во-вторых, реально это свойство можно использовать только в меню, так как меню не получает фокус и активным элементом остается выбранный объект. При использовании, например, свойства .ActiveControl в процедуре CommandButton, при нажатии на кнопку Command1 фокус перейдет с нужного нам элемента на командную кнопку и мы не получим желаемого результата. Ниже, в этой главе, мы на примере работы с объектом Clipboard будем использовать это свойство применительно к меню.

Аналогично свойству .ActiveControl и свойство и .ActiveForm, но содержит ссылку на активную форму. Тогда, чтобы добраться до какого-либо элемента можно применить, например, такой оператор:






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.