В этом уроке мы научились:
Использовать стандартные окна сообщений Visual Basic для вывода информации.
Использовать окна ввода для простейшего сбора информации.
Создавать нестандартные диалоговые окна.
Интегрировать класс диалоговых окон в будущих приложениях.
УРОК
Работа с мышью
Обработка событий мыши
Перетаскивание
Перетаскивание OLE
Создание «пасхального яйца»
События мыши
До сих пор нам приходилось иметь дело с двумя событиями, связанными с мышью, — Click и DblClick (двойной щелчок). В этом уроке будет рассказано и о других событиях мыши, используемых в Visual Basic. K их числу относятся перемещение мыши и нажатия кнопок — самостоятельно или одновременно с клавишами Shift, Alt и Ctrl Эти события обрабатываются в процедурах MouseDown и MouseUp, а также MouseMove. В последнем событии удобно отображать и скрывать подсказки, когда указатель мыши проходит над кнопками панели инструментов. Различные элементы поддерживают разные события мыши. В этом уроке рассматриваются основные события мыши вместе со способами их применения. В частности, мы напишем небольшую программу, обрабатывающую процедуру перетаскивания. После этого вы будете хорошо представлять себе, какие события мыши следует использовать в ваших элементах.
|
|
Событие Click
Событие Click генерируется при щелчке мышью на элементе. Почти все элементы Visual Basic, отображаемые во время выполнения программы, поддерживают событие Click, но чаще всего оно используется для кнопок. Код, находящийся в процедуре события Click кнопки, выполняется при нажатии этой кнопки мышью. Например:
Private Sub cmdOK_Click()
Unload Me
End Sub
Событие DblClick
Событие двойного щелчка, DblClick, вызывается при двух быстрых последовательных щелчках мышью. Чувствительность двойного щелчка задается при настройке параметров мыши в Панели управления Windows. B списках это событие часто применяется для просмотра свойств, а также для добавления и удаления выделенных строк. Например:
Private Sub lstmembers_DblClick()
Dim m As clsMember
Set m = New clsmember
m.MemberName = lstMembers.Text
m.ShowMemberProperties Set m = Nothing
End Sub
Обычно двойной щелчок мышью используется для ускоренного выполнения команды меню или нажатия кнопки.
Событие DragDrop
Событие DragDrop генерируется при сбрасывании объекта, перетаскиваемого мышью. Процедура события DragDrop имеет следующий синтаксис:
Private Sub target_DragDrop(Source As Control, X As Single, Y As Single)
Обратите внимание на три параметра — перед тем как выполнять любые дальнейшие действия, можно проверить их значения. Параметр Source содержит имя элемента, сброшенного на текущий объект. Параметры X и Y определяют координаты указателя мыши на момент генерации события DragDrop(). Пользуясь ими, можно задать расположение элемента на приемнике. Более подробная информация о перетаскивании приведена в следующем разделе этого же урока.
|
|
Coбытие DragOver
Событие DragOver генерируется при протаскивании объекта над элементом. Процедура события имеет следующий синтаксис:
Private Sub target_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
Source — имя протаскиваемого объекта. Параметры X и Y определяют координаты указателя мыши. Целая переменная State определяет состояние перетаскиваемого объекта по отношению к приемнику события.
Параметр State | Назначение |
Объект входит в границы источника | |
Объект покидает границы источника | |
Объект перетаскивается внутри границ источника |
С помощью этого события удобно сообщать пользователям, можно ли в настоящий момент сбросить перетаскиваемый объект. Например, вряд ли стоит разрешать сбрасывание объекта на кнопке; при генерации события DragOver() кнопки можно проверить параметр Source и задать свойству DragIcon значок «сбрасывание запрещено».
Событие MouseDown
Если нажать кнопку мыши и не отпускать ее, генерируется событие MouseDown. Процедура события MouseDown() имеет следующий синтаксис:
Private Sub target_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single).
Как и в других событиях мыши, параметры X и Y определяют положение указателя. Целый параметр Button принимает одно из трех значений.
Параметр Button | Описание |
Левая кнопка мыши | |
Правая кнопка мыши | |
Средняя кнопка мыши |
По значению этого параметра можно узнать, какая кнопка была нажата. Это удобно в тех случаях, когда при нажатии кнопки должно открываться контекстное меню элемента. Например:
Private Sub lstMembers_MouseDown(Button As Integer, Shift As Integer,
X As Single, Y As Single)
If Button = 2 Then
PopupMenu mnuMembers
End If
End Sub
Целочисленный параметр Shift описывает состояние клавиш Shift, Ctrl и Alt на момент нажатия кнопки. Он принимает следующие значения.
Параметр Shift | Описание |
Клавиша Shift | |
Клавиша Ctrl | |
Клавиша Alt |
Сумма этих величин определяет различные сочетания клавиш. Например, значение 6 означает, что были нажаты Ctrl и Alt, a значение 7 показывает, что все три управляющие клавиши были нажаты одновременно. При проверке параметра Shift часто используется ключевое слово And. C помощью вложенных конструкций If...Then можно отслеживать разные клавиши. Например, фрагмент:
If Shift = 6 Then
MsgBox "Нажаты клавиши Ctrl и Alt"
End If
эквивалентен следующему:
If Shift And 6 Then
MsgBox "Нажаты клавиши Ctrl и Alt"
End If
Событие MouseMove
Событие MouseMove генерируется при перемещении мыши над элементом. В его процедуре можно изменить состояние элемента, находящегося под указателем мыши, например перекрасить в зеленый цвет незаблокированную кнопку при прохождении указателя мыши. Процедура события имеет следующий синтаксис:
Private Sub cmdExit_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Параметры этого события идентичны параметрам события MouseDown. В следующем примере заголовок формы изменяется, когда указатель мыши проходит над кнопкой Exit:
Private Sub cmdExit_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Me.Caption = "Нажмите, чтобы закрыть приложение"
End Sub
Аналогичный код можно включить и в процедуры событий MouseMove других элементов. До появления механизма подсказок я часто пользовался этим событием для вывода в строке состояния справочных сообщений.
Событие MouseUp
Если отпустить нажатую кнопку мыши над элементом, генерируется событие MouseUp(). Процедура события имеет следующий синтаксис:
Private Sub target_MouseUp(Button As Integer, Shift As Integer,
X As Single, Y As Single)
Его параметры совпадают с параметрами MouseDown и MouseMove. Во многих новых приложениях для Windows 95 это событие используется вместо Click. Например, в процедуру события MouseUp можно включить оператор End, чтобы пользователь мог продолжить работу с приложением даже после нажатия кнопки выхода. Чтобы отменить выход, следует отвести указатель мыши от кнопки и отпустить нажатую кнопку мыши. В этом случае оператор End не выполняется, поскольку событие MouseUp генерируется для другого объекта.
|
|
Перетаскивание
Перетаскивание все чаще используется в Windows-приложениях (например, для регулировки положения разделительной полосы в Windows Explorer). Благодаря ему многие операции выполняются быстрее и проще. Наделить приложение Visual Basic возможностью перетаскивания не так уж сложно. Следующий пример показывает, как это делается:
1. Создайте новый проект типа Standard EXE.
2. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption — значение Перетаскивание.
3. Поместите на форму два списка одинакового размера. Один должен находиться в верхней, а другой — в нижней частях формы.
4. Задайте свойству Name верхнего списка значение lstA, а свойству DragIcon — значение \Graphics\Icons\DragDrop\Draglpg.ico.
5. Задайте свойству Name нижнего списка значение lstB, а свойству DragIcon -значение \Graphics\Icons\DragDrop\Draglpg.ico. Примерный вид формы показан на рис. 11.1.
Рис. 11.1. Приложение с поддержкой перетаскивания
6. Добавьте в процедуру события Form_Load() следующий фрагмент:
Private Sub Form_Load()
lstA,AddItem "Яблоки"
lstA.AddItem "Персики"
lstA,AddItem "Апельсины"
End Sub
7. Добавьте в процедуру события lstA_MouseDown() следующий фрагмент:
Private Sub lstA_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If lstA.ListCount > 0 Then
lstA.Drag 1
End If
End Sub
8. Добавьте в процедуру события lstA_DragDrop() следующий фрагмент:
Private Sub lstA_DragDrop(Source As Control, X As Single, Y As Single)
If Source = lstB Then
lstA.Additem lstB.Text
lstB.RemoveItem lstB.ListIndex
End If
End Sub
9. Добавьте в процедуру события lstB_MouseDown() следующий фрагмент:
Private Sub lstB_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If lstB.ListCount > 0 Then
lstB.Drag 1
End If
End Sub
10. Добавьте в процедуру события lstB__DragDrop() следующий фрагмент:
|
|
Private Sub lstB_DragDrop(Source As Control, X As Single, Y As Single)
If Source = lstA Then
lstB.Additem lstA.Text
lstA.RemoveItem lstA.ListIndex
End If
End Sub
11. Сохраните и запустите проект.
Верхний список содержит несколько строк с названиями фруктов. Вы можете щелкнуть на любой строке и перетащить ее в нижний список. Когда указатель мыши окажется над ним, отпустите кнопку мыши. Затем строки можно перетащить обратно в верхний список (рис. 11.2).
Рис. 11.2. Перетаскивание строк
Ключевым для этой программы является метод Drag. Обратите внимание — в процедуре события MouseDown() он вызывается с параметром 1, который сообщает элементу о начале перетаскивания. Если параметр равен 0, перетаскивание прекращается. Иными словами, чтобы прекратить перетаскивание, следует присвоить свойствам Тор и Left значения координат x и у указателя мыши и вызвать метод Drag 0. При этом имитируется перемещение объекта, тогда как на самом деле оно выполняется в процедуре события DragDrop().
Наш разговор о перетаскивании подходит к концу. Попробуйте немного поэкспериментировать — развлекайтесь и заодно следите за происходящим. Возможно, вам захочется использовать перетаскивание в своих проектах. Обратите внимание на свойство DragIcon источника, то есть перетаскиваемого объекта. Если не задать его значение, вы увидите лишь контур перетаскиваемого объекта.
Перетаскивание OLE
В Windows 95 появился новый, более универсальный, тип перетаскивания — так называемое «перетаскивание OLE» (OLE drag-and-drop). Сокращение OLE означает Object Linking and Embedding, то есть «связывание и внедрение объектов». Этот тип перетаскивания позволяет перемещать текст, файлы и объекты между элементами, которые выполняют функции контейнеров OLE, — списками, текстовыми и графическими полями. В окне программы Visual Basic предусмотрены некоторые возможности, построенные на основе перетаскивания OLE. При перемещении файлов из Проводника Windows в папку диска С вы также выполняете операцию перетаскивания OLE.
При перетаскивании OLE создается глобальный объект, содержащий перетаскиваемые данные. В процедуре события OLEDragDrop можно получить доступ к содержимому объекта DataObject. Давайте поближе познакомимся с методами и событиями перетаскивания OLE.
Метод OLEDrag
Метод OLEDrag начинает операцию перетаскивания OLE. Он вызывается в тех случаях, когда вы хотите скопировать или переместить данные OLE между двумя контейнерами OLE. Метод имеет следующий синтаксис:
объект.0LЕDrаg
где объект — объект-контейнер OLE, который является источником для операции перетаскивания.
Свойство OLEDragMode
С помощью свойства OLEDragMode можно узнать, способен ли объект выполнять функции источника перетаскивания OLE и в каком режиме будет выполняться операция OLEDrag — в ручном или автоматическом. Свойство может принимать следующие значения.
vbOLEDragManual - 0 | Принимается по умолчанию. Используется при создании ваших собственных обработчиков перетаскивания OLE в приложениях |
VbOLEDragAutomatic - 1 | Используется в тех случаях, когда Visual Basic организует автоматическую обработку операций перетаскивания OLE. Это самый простой способ обеспечить поддержку перетаскивания OLE в ваших приложениях |
Свойство OLEDropMode
Свойство OLEDropMode похоже на OLEDragMode. Задавая его значение, вы определяете тип обработки событий сбрасывания OLE в вашем приложении. Свойство может принимать одно из трех значений.
vbOLEDropNone - 0 | Принимается по умолчанию. Не позволяет контейнеру OLE выполнять функции приемника для событий сбрасывания OLE |
VbOLEDropManual - 1 | Используется при создании ваших собственных обработчиков сбрасывания OLE в приложениях |
VbOLEDropAutomatic - 2 | Используется в тех случаях, когда Visual Basic организует автоматическую обработку операций сбрасывания OLE. Это самый простой способ обеспечить поддержку сбрасывания OLE в ваших приложениях |