![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
If Data.GetFormat(vbCFDIB) Then .
Теперь далее. Если наш формат правильный, то мы можем загрузить картинку, используя метод GetData для все того же объекта DataObject. Метод GetData возвращает данные объекта DataObject в установленном формате. Обратный ему метод SetData устанавливает данные в нужном формате объекта DataObject. объект.GetData (format) где Теперь, собственно, загрузка нашей картинки будет выглядеть так: Effect = vbDropEffectCopy 'например для копирования Но надо сказать, что поскольку пакет данных для перетаскивания готовился в объекте-источнике в неизвестном нам приложении, то толку от использования этого параметра будет мало. Т.е. вообще не будет. Этот параметр сообщает в объект-источник, какое действие было выполнено. Но объект источник-то - в чужом приложении и ему в большей степени наплевать на наш параметр. Этот параметр сработает, если только второе приложение - тоже создавалось нами и для его объекта-источника определены соответствующие процедуры. Но мы все-таки оставим этот оператор для, так сказать, чистоты эксперимента. В результате наша процедура будет такая:
Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Как видишь все на самом деле просто. У нас еще осталось неиспользованое событие _OLEDragOver. С его помощью и с помощью параметра Effect мы можем управлять курсором мыши. В зависимости от параметра Effect курсор мыши может иметь следующий вид:
Для курсора копирования мы можем записать такую процедурку: 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) Надо сказать, что все прочие параметры события _OLEDragOver имеют контрольный характер и нас не интересуют. Хотя, отслеживая значение параметра State мы можем подгружать изображение нужных нам курсоров (если есть желание), как мы делали в прошлой, 18-й главе. Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 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) Теперь, если мы выделим в чужом окне, например, хоть окне кода того же Basic'а кусочек строки, то его можно будет перетянуть в Text1. Единственное, что я хочу заметить, мы в качестве свойства Text1 использовали незнакомое нам свойство .SelText. Мы могли бы использовать и свойство .Text, но тогда вставляемый текст просто заменял бы уже существующий. А с использованием свойства .SelText мы можем вставлять фрагмент текста в уже существующий текст в любое место. Подробней это и сопутствующие ему свойства рассмотрены в следующей 20-й главе. Итак, как видите, ничего сложного, больше пугающих таблиц со свойствами и константами, чем строк кода. Private Sub Form_Load() Обрати внимание, что я не писал свойство .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) При запуске метода OLEDrag возникает событие _OLEStartDrag, которое позволяет нам сформировать данные для объекта-приемника. Данные эти надо поместить в объект DataObject с помощью метода SetData. Так же, с помощью параметра AllowedEffects мы можем определить порядок перетаскивания (копирование или перемещение): Private Sub Text1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) Обрати внимание, что если нам надо включить в DataObject несколько форматов, это достигается повторным вызовом метода .SetData каждый раз с новым форматом. Поэтому, чтобы гарантировать, что у нас нет ранее вызванных форматов, перед первым вызовом объект DataObject очищается с помощью метода Clear. Мы можем использовать тот вид курсора, который нам захочется. Сделать это можно в процедуре события _OLEGiveFeedback, в зависимости от значения его параметра Effect. Для этого используется объект Screen и его свойства .MousePointer и .MouseIcon: Private Sub Text1_OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean) После окончания перетаскивания для объекта-источника возникает событие _OLECompleteDrag. В этой процедуре мы можем очиститьText1, если перетаскивание было перемещением, а не копированием и кроме того, надо обязательно вернуть курсор к виду, который у него был до начала перетаскивания. Private Sub Text1_OLECompleteDrag(Effect As Long) Обратите внимание, что проверка константы vbDropEffectMove осуществляется не так, как можно было бы предположить, исходя из здравого смысла, а именно: If Effect = vbDropEffectMove..., а маскируется с помощью логической операции And. В полном виде это выглядело бы так:
В Visual Basic существуют объекты, не отображаемые на форме, но использование которых несложно и может принести некоторую пользу. В прошлых главах мы говорили об объектах Printer, Err и DataObject. Давайте поговорим еще о парочке.
По-сути, объект Screen представляет собой весь экран или иначе Десктоп (DeskTop). Как и другие объекты, объект Screen имеет определенные свойства. Так, например, почему-то считается, что для определения разрешения экрана надо использовать API-функции. Но это прекрасно можно сделать и внутренними возможностями VB. У объекта Screen есть свойства .Height и .Width, которые и возвращают высоту и ширину экрана в твипах. Эти самые твипы легко преобразовать в пиксели, если использовать два других свойства объекта Screen - .TwipsPerPixelX (которое возвращает количество твипов в пикселе по-горизонтали) и .TwipsPerPixelY (которое возвращает количество твипов в пикселе по-вертикали). Таким образом, чтобы определить разрешение экрана, мы пишем приблизительно следующий код: Private Sub Command1_Click() Еще одно свойство .ActiveControl содержит ссылку на элемент управления (и его свойства), имеющий фокус. Смысл использования этого свойства следующий. Например, у тебя на формe три текстбокса. И ты хочешь активный текстбокс очистить. Вот в этом случае и можно использовать свойство .ActiveControl, например Screen.ActiveControl.Text=" " т. е. очищается тот объект (в нашем случае TextBox), на котором в данный момент находится фокус. Это, конечно, несколько упрощено, поскольку, во-первых, необходимо проверить, а текстбокс ли это? Может у тебя на форме есть другие элементы, например, PictureBox. Во-вторых, реально это свойство можно использовать только в меню, так как меню не получает фокус и активным элементом остается выбранный объект. При использовании, например, свойства .ActiveControl в процедуре CommandButton, при нажатии на кнопку Command1 фокус перейдет с нужного нам элемента на командную кнопку и мы не получим желаемого результата. Ниже, в этой главе, мы на примере работы с объектом Clipboard будем использовать это свойство применительно к меню. Аналогично свойству .ActiveControl и свойство и .ActiveForm, но содержит ссылку на активную форму. Тогда, чтобы добраться до какого-либо элемента можно применить, например, такой оператор:
|