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 – имя события.

·        KeyAsciiASCII-код клавиши, которая была нажата.

 

Событие «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»), который будет отображаться при перемещении объекта вместо указателя мыши. В противном случае на экране просто будет отображен профиль этого объекта.

 

 

Контрольные вопросы для самопроверки

  1. Какие события ассоциируются с работой клавиатуры?
  2. В чем разница событий «KeyPress» и «KeyDown»?
  3. Что собой представляет код «ANSI»?
  4. Какие события отражают работы манипулятора «мышь»?
  5. Как узнать текущие координаты указателя мыши?
  6. Как расширить возможности клавиатуры и мыши использованием специальных клавиш <Shift>, <Ctrl> и <Alt>?
  7. Как запрограммировать событие на реакцию нажатия только определенные клавиши клавиатуры и мыши?
  8. Как можно переместить объект по форме?
  9. Какими событиями пользуются при перемещении объекта с помощью мыши?