12.
ОБРАБОТКА
СИГНАЛОВ ОТ
ВНЕШНИХ
УСТРОЙСТВ
Windows является независимой от внешних устройств операционной системой, в которой они представлены как абстрактные устройства. Программисту не надо думать какие Конкретные устройства подключены к компьютеру, и помнить только о том, к какой категории они относятся.
Большинство элементов управления Visual Basic поддерживают три события клавиатуры – «KeyPress», «KeyUp» и «KeyDown» – и пять событий мыши – «Click», «DblClick», «MouseUp», «MouseDown» и «MouseMove».
12.1.
Обработка
событий
клавиатуры
Когда во время выполнения программы пользователь нажимает клавишу клавиатуры, Windows генерирует событие «KeyPress» (нажатие клавиши) сначала для находящейся в фокусе формы, а затем для находящегося в фокусе элемента управления. Процедура обработки этого события имеет следующий синтаксис:
Private Sub Name_KeyPress(KeyAscii As Integer)
· Private – область действия процедуры обработки события.
· Name – имя элемента управления, которому адресовано событие.
·
KeyPress
– имя
события.
· KeyAscii – ASCII-код клавиши, которая была нажата.
Событие «KeyPress» ассоциируется с символом нажатой клавиши. Когда происходит событие, Visual Basic передает в аргумент «KeyAscii» ASCII-код символа, соответствующего нажатой клавише, и делает его доступным в процедуре обработки события.
Примечание |
Событие «KeyPress» генерируется только для клавиш с буквами, цифрами и клавиш выбора команд. |
Коды ASCII – это числа, присвоенные в результате формального соглашения каждой букве алфавита (строчным и прописным соответствуют разные коды), а также цифрам и знакам пунктуации.
Примечание |
В данном случае термин «ASCII» используется в своей классической трактовке: кодировка первых 128 символов, которая совпадает и в DOS и в Windows. На самом деле речь идет о стандарте ANSI, т.е. Windows-кодировке. При этом кириллические символы кодируются не так как в DOS. |
Когда пользователь нажимает клавишу на клавиатуре, для находящегося в фокусе элемента управления генерируется событие «KeyDown» (нажатие клавиши), а когда отпускает – событие «KeyUp» (отпускание клавиши). Процедуры обработки этих событий имеют следующий синтаксис:
Private Sub Name_KeyDown(KeyCode As Integer, Shift As Integer)
Private Sub
Name_KeyUp(KeyCode As Integer, Shift As Integer)
· Private – область действия процедуры обработки события;
· Name – имя элемента управления, которому адресовано событие;
·
KeyDown/KeyUp –
имена
событий;
· KeyCode – целое число, равное значению константы, описывающей нажимаемую или отпускаемую клавишу;
· Shift – целое число, сообщающее о том, были ли нажаты клавиши <Shift>, <Ctrl> и/или <Alt>.
Примечание |
Важное различие между событиями «KeyDown/KeyUp» и событием «KeyPress» заключается в том, что первые связаны с клавишами клавиатуры, а последние – с введенным символом. Если программе необходимо определить введенный символ, нужно использовать событие «KeyPress», а если определить какая именно клавиша была нажата – то события «KeyDown» или «KeyUp». |
Параметр «KeyCode» сообщает обо всех клавишах клавиатуры, включая клавиши управления курсором, функциональные клавиши (F1…F12), клавиши дополнительной клавиатуры и др. Для всех значений, которые могут быть переданы в параметре «KeyCode», соответствуют определенные константы.
Параметр «Shift» сообщает об одновременном нажатии клавиш <Shift>, <Ctrl> и/или <Alt>. В зависимости от их комбинации параметр имеет значения, приведенные в табл. 27.
Таблица 27
Значения параметра «Shift»
Клавиша или их комбинация |
Значение |
<Shift> |
1 |
<Ctrl> |
2 |
<Alt> |
3 |
<Shift + Ctrl> |
4 |
<Shift + Alt> |
5 |
<Ctrl + Alt> |
6 |
<Shift + Ctrl + Alt> |
7 |
Иногда необходимо, чтобы ввод с клавиатуры обрабатывался именно формой, даже если фокус находится у элемента управления. Сделать это позволяет свойство формы «KeyPreview». При создании формы это значение принимается равным «False». Если же его установить равным «True», то форма будет перехватывать весь ввод с клавиатуры, с которым теперь можно работать в процедурах обработки событий самой формы. И только после этого будет передано управление элементу управления, находящемуся в фокусе.
12.2.
Обработка
событий мыши
Когда вы что-нибудь делаете с помощью мыши, генерируется определенное событие. При щелчке мышью происходит событие «Click», при двойном щелчке – «DblClick», а в момент перемещения указателя – «Move». Где и когда произойдет определенное событие, зависит от положения указателя мыши. Иногда одно действие производит несколько событий.
Событие «Click» характерно практически для всех объектов и процедура обработки этого события имеет следующий синтаксис:
Private Sub Name_Click()
· Private – область действия процедуры обработки события;
· Name – имя элемента управления, которому адресовано событие;
·
Click
– имя
события.
Аналогично можно запрограммировать событие «DblClick», указав это слово в заголовке процедуры вместо «Click».
Примечание |
Эти два события связаны только со щелчками левой клавишей мыши, правая и средняя в этом случае будут игнорироваться. |
При щелчках мыши происходят и другие события: «MouseDown» (нажатие клавиши), «MouseUp» (отпускание клавиши). Процедуры их обработки имеют следующий синтаксис:
Private Sub Name_MouseDown(Button As Integer,_
Shift As Integer, X As
Single, Y As Single)
Private Sub
Name_MouseUp(Button As Integer,_
Shift As Integer, X As Single, Y As Single)
·
Private
– область
видимости
события.
· Name – имя элемента управления, которому адресовано событие.
· MouseDown/MouseUp – имена обрабатываемых событий.
· Button – целое число, указывающее нажатую клавишу мыши (см. табл. 28).
· Shift – целое число, описывающее состояние клавиш <Shift>, <Ctrl> и <Alt> на клавиатуре в момент генерирования события (см табл. 27).
· X – координата указателя мыши по горизонтали.
· Y – координата указателя мыши по вертикали.
Таблица 28
Значение, соответствующее комбинациям нажатых кнопок мыши
Нажатая кнопка (кнопки) мыши |
Значение параметра «Button» |
Левая |
1 |
Правая |
2 |
Левая и правая |
3 |
Средняя |
4 |
Левая и средняя |
5 |
Правая и средняя |
6 |
Все три |
7 |
Процедуры обработки события «MouseDown» и «MouseUp» являются более сложными и обладающие расширенными возможностями по сравнению с процедурами событий «Click» и «DblClick».
Примечание |
Выполнение процедур обработки событий «MouseDown» и «MouseUp» нельзя запрограммировать на конкретную клавишу мыши, но можно узнать какой клавишей она была запущена. |
При перемещении указателя мыши генерируется событие «MouseMove», имеющее следующий синтаксис:
Private Sub
Name_MouseMove(Button As Integer,_
Shift As Integer, X As Single, Y As Single)
·
Private
– область
видимости
события.
· Name – имя элемента управления, которому адресовано событие.
· MouseMove – имя обрабатываемого события.
· Button – целое число, указывающее нажатую клавишу мыши (см. табл. 14).
· Shift – целое число, описывающее состояние клавиш <Shift>, <Ctrl> и <Alt> на клавиатуре в момент генерирования события (см табл. 13).
· X – координата указателя мыши по горизонтали.
· Y – координата указателя мыши по вертикали.
При этом перемещение должно быть обязательно над элементом управления, для которого была написана процедура обработки события.
В отношении этого события важно помнить следующее: процедура генерируется при каждом перемещении мыши. Поэтому если процедура имеет слишком большой размер, то она не будет успевать выполняться в промежутки между ее вызовами. В результате это может разрушить всю работу приложения.
Visual Basic имеет два серьезных недостатка при обработке событий мыши:
12.3.
Перемещение
объектов
Иногда может возникнуть необходимость предоставить пользователю возможность перемещения объектов по форме. Это можно сделать, непосредственно изменяя свойства «Left» и «Top» у перемещаемых объектов. Однако это можно реализовать более гибким и удобным способом, используя события «схватить и бросить». Хотя это событие и реализуется для формы в целом, но осуществляется с помощью мыши.
Любой видимый элемент управления обладает особым свойством «DragMode». При его значении «0 – Manual» перемещение объекта запрещается, и он работает обычным образом. В случае его значения «1 – Automatic» перемещение разрешается, но прочая его работа (все остальные события) блокируется.
Процедура обработки события, которое связано с перемещением элементов управления, имеет следующий синтаксис:
Private Sub
Form_DragDrop(Source As Control,_
X As Single, Y As Single)
...
Source.Move X, Y
End Sub
· Private – область видимости процедуры обработки события.
· Form – поскольку событие адресуется только форме, то в качестве имени управляющего объекта необходимо записывать слово «Form».
·
DragDrop
– имя
события.
· Source – особая переменная, в которой хранится имя перетаскиваемого элемента управления (свойство «Name»); работает как ссылка на него.
· Control – зарезервированное слово, описывающее переменную ссылку.
· X,Y – текущие координаты указателя мыши.
· Source.Move X, Y – метод, перемещающий элементы управления по форме.
Примечание |
Текущие координаты «X» и «Y» будут присвоены свойствам «Left» и «Top» перемещаемого объекта соответственно, т.е. координатам левого верхнего угла элемента управления. |
При перемещении иногда бывает важным узнать, возможно ли оно или нет. Отследить подобное помогает специальное событие «DragOver», процедура обработки которого имеет следующий синтаксис:
Private Sub
Form_DragOver(Source As Control,_
X As Single, Y As Single, State As Integer)
· Private – область видимости процедуры обработки события.
· Form – поскольку событие адресуется только форме, то в качестве имени управляющего объекта необходимо записывать слово «Form».
·
DragOver
– имя
события.
· Source – особая переменная, в которой хранится имя перетаскиваемого элемента управления (свойство «Name»); работает как ссылка на него.
· Control – зарезервированное слово, описывающее переменную ссылку.
· X,Y – текущие координаты указателя мыши.
· State – специальный параметр, определяющий характер перемещения.
Параметр «State» может принимать несколько значений в зависимости от характера перемещения (см. табл. 29).
Таблица 29
Возможные значения параметра «State»
Значение |
Описание перемещения |
0 |
Перетаскивание элемента управления с несвободного места на свободное |
1 |
Перетаскивание элемента управления со свободного места на занятое |
2 |
Перетаскивание элемента управления с одного свободного места на другое свободное |
Еще одним полезным свойством перетаскиваемого элемента управления является «DragIcon». Оно хранит в себе некоторый графический образ (файл пиктограммы «*.ico»), который будет отображаться при перемещении объекта вместо указателя мыши. В противном случае на экране просто будет отображен профиль этого объекта.
Контрольные
вопросы для
самопроверки