99591

События клавиатуры

Контрольная

Информатика, кибернетика и программирование

Эти события следует использовать для определения состояний которые не может определить событие KeyPress а именно: – Специальные комбинации клавиш Shift Ctrl и Alt – Нажатие клавиш со стрелками. Чтобы определить в каком регистре нажата клавиша А эти события используют параметр shift. Заметим что 1 на основной клавиатуре и 1 на дополнительной цифровой клавиатуре возвращаются как разные клавиши хотя они генерируют один и тот же символ – Параметр shift. Указывает состояние клавиш Shift CtrI и Alt...

Русский

2016-09-25

63.5 KB

2 чел.

События клавиатуры

Программирование реакции приложения на события клавиатуры иногда называют созданием программного обработчика (или просто обработчика) клавиатуры (keyboard handler) Обработчик клавиатуры может работать на двух уровнях: на уровне элемента управления и на уровне формы. Обработчик уровня элемента управления (обработчик нижнего уровня) позволяет программировать конкретный элемент управления. Например, можно преобразовать весь набранный в текстовом поле текст в прописные буквы. Обработчик уровня формы позволяет, чтобы форма первой реагировала на события клавиатуры. Затем фокус может быть перемещен на элемент управления или элементы управления на форме, и события могут быть либо повторены, либо инициированы.

С помощью этих событий клавиатуры можно писать код обработки большинства клавиш стандартной клавиатуры.

Обработчик клавиатуры нижнего уровня

Visual Basic предоставляет три события, которые распознаются формами и элементами управления, допускающими ввод с клавиатуры. Они представлены –в таблице 3.

Таблица 3. События клавиатуры

Событие клавиатуры

Происходит

KeyPress

Нажата клавиша, соответствующая символу ASCII

KeyDown

Нажата любая клавиша на клавиатуре

KeyUp

Отпущена любая клавиша на клавиатуре

Только объект, имеющий фокус, может получить событие клавиатуры. Для этих событий форма имеет фокус, только если она активна и ни один элемент управления на ней не имеет фокус. Это может произойти только для пустой формы или для формы, на которой все элементы управления недоступны. Однако, если свойство KeyPreview формы установлено равным True, форма получает все события клавиатуры для каждого элемента управления на форме до того, как элемент управления распознает его. Это особенно полезно, если требуется выполнить одинаковое действие при нажатии любой клавиши, вне зависимости от того, какой элемент управления имеет фокус в данный момент.

События KeyDown и КеуUр предоставляют отклик самого нижнего уровня на события клавиатуры. Эти события следует использовать для определения состояний, которые не может определить событие KeyPress, а именно:

– Специальные комбинации клавиш <Shift>, <Ctrl> и <Alt>

– Нажатие клавиш со стрелками. Заметим, что некоторые элементы управления (кнопки управления, переключатели и флажки) не получают событий при нажатии таких клавиш: их нажатие приводит к перемещению на следующий элемент управления

– Нажатие клавиш <PageUp> и <PageDown>

– Распознавание нажатия цифровых клавиш на вспомогательной цифровой клавиатуре и на основной клавиатуре

– Реагирование как на нажатие, так и на отпуск клавиши (событие KeyPress отвечает только на нажатие)

– Нажатие функциональных клавиш, не связанных с командами меню

События клавиатуры не являются взаимоисключающими. Если пользователь нажимает клавишу, генерируются события KeyDown и KeyPress, за которыми следует событие КеуUр, когда пользователь отпускает клавишу. Если пользователь нажимает одну из клавиш, которую не распознает событие KeyPress, происходит только событие KeyDown, за которым следует событие KеуUр.

Перед тем как использовать события KеуUр и KeyDown, следует убедиться, что события KeyPress недостаточно. Это событие распознает нажатие клавиш, которые соответствуют символам ASCII: буквы, цифры и знаки препинания на стандартной клавиатуре, а также клавиши <Enter>, <Tab> и <Backspace>. Обычно событие KeyPress запрограммировать легче.

Событие KeyPress

Событие KeyPress происходит, когда нажата любая клавиша, соответствующая символу ASCII. Набор символов ASCII представляет не только буквы, цифры и знаки препинания на стандартной клавиатуре, но также и большинство клавиш управления. Однако событие KeyPress распознает только клавиши <Enter>, <Tab> и <Backspace>. Другие функциональные клавиши, клавиши редактирования и клавиши перемещения можно распознать событиями KeyDown и KeyUp.

Следует использовать событие KeyPress, если необходимо обрабатывать стандартные символы ASCII. Например, чтобы перевести все символы в текстовом поле в символы верхнего регистра, следует использовать это событие для изменения регистра символов при их вводе:

Private Sub Text1_KeyPress(KeyAscii As Integer)

KeyAscii = Asc(UCase(Chr(KeyAscii)))

End Sub

Параметр KeyAscii возвращает целое значение, соответствующее ASCII коду символа. Представленная выше процедура использует функцию Chr для преобразования кода символа ASCII в соответствующий символ, функцию UCase для перевода символа в верхний регистр и функцию Asc для преобразования результата обратно в код символа.

Используя ASCII коды символов, можно проверить, нажата ли клавиша, распознаваемая событием KeyPress. Например, следующая процедура определяет, нажата ли клавиша <Backspace>:

Private Sub Text1_KeyPress(KeyAscii As Integer)

   If KeyAscii = 8 Then MsgBox "You pressed theBACKSPACE key."

End Sub

Также можно использовать константы Visual Basic для кодов клавиш вместо кодов символов. В приведенном примере клавиша <Backspace> имеет ASCII значение 8. В Visual Basic для этой клавиши зарезервирована константа vbKeyBack.

События KeyDown и KeyUp

События KeyDown и KeyUp сообщают точное физическое состояние самой клавиатуры: клавиша нажата (событие KeyDown) и клавиша отпущена (событие KeyUp). Событие KeyPress не сообщает непосредственно состояние клавиатуры – оно не распознает состояния нажатия и отпуска клавиши, а просто поставляет соответствующий символ.

Следующий пример иллюстрирует различия. Когда пользователь набирает на клавиатуре прописное <А>, событие KeyDown получает ASCII код для символа "А". Это событие получает тот же самый код, если пользователь набирает строчную букву <а>. Чтобы определить, в каком регистре нажата клавиша <А>, эти события используют параметр shift. Событие KeyPress рассматривает одну и ту же букву в верхнем и нижнем регистре как два различных символа ASCII.

События KeyDown и KeyUp возвращают информацию о нажатом символе при помощи двух параметров:

– Параметр KeyCode. Указывает нажатую клавишу. В этом случае <А> и <а> являются одной и той же клавишей. Они имеют одинаковое значение параметра KeyCode. Заметим, что "1" на основной клавиатуре и "1" на дополнительной цифровой клавиатуре возвращаются как разные клавиши, хотя они генерируют один и тот же символ

– Параметр shift. Указывает состояние клавиш <Shift>, <CtrI> и <Alt>. Только анализируя этот параметр, можно определить, в каком регистре была набрана буква.

Параметр KeyCode

Параметр KeyCode идентифицирует клавишу по ее ASCII значению или константе кода клавиши. Коды клавиш, соответствующих буквам, являются такими же, что и ASCII коды символов букв верхнего регистра. Следовательно, значением параметра KeyCode для <А> и <а> является значение, возвращаемое функцией Asc("A"). В следующем примере используется событие KeyDown для определения, была ли нажата клавиша <А>:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyA Then MsgBox "You pressed the A key."

End Sub

Нажатие комбинации клавиш <Shift>+<A> или просто <А> без <Shift> отображает сообщение, т.е. в каждом случае параметр правильный. Чтобы определить, была ли нажата буква в верхнем или нижнем регистре, следует использовать параметр shift.

Коды клавиш для цифр и знаков препинания такие же, что и ASCII код цифры на клавише. Поэтому для "1" и "!" значение параметра KeyCode равно значению, возвращаемому функцией Asc('1"). Как и раньше, чтобы проверить, набирался ли символ "!", следует использовать параметр shift.

События KeyDown и KеуUр распознают большинство клавиш управления стандартной клавиатуры. Это функциональные клавиши (<F1>—<F16>), клавиши редактирования (<Delet>, <BackSpace> и т.д.), клавиши перемещения (<Right>, <Left>, <Up> и <DownArrow>) и клавиши дополнительной клавиатуры. Эти клавиши можно проверить, используя или константу кода клавиши или эквивалентное ASCII значение. Например:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyA Then MsgBox "You pressed the HOME key."

End Sub

Параметр Shift

События клавиш используют параметр shift точно так же, как и события мыши – как целые значения или константы, которые представляют клавиши <Shift>, <Ctrl> и <Alt>. Параметр shift можно использовать вместе с событиями KeyDown и KеуUр, чтобы различать символы верхнего и нижнего регистров или проверять состояния мыши.

В следующем примере параметр shift позволяет определить, в каком регистре была нажата буква:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyA And Shift = 1_

   Then MsgBox "You pressed the uppercase A key."

End Sub

Как и события мыши, события KеуUр и KeyDown распознают нажатие клавиш <Shift>, <Ctrl> и <Alt> или их комбинации. В следующем примере проверяются специфические состояния клавиш смешения.

Откроем новый проект и добавим переменную ShiftKey в секцию Declarations формы:

Dim ShiftKey as Integer

Добавим текстовое поле к форме и следующую процедуру в событие KeyDown:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   ShiftKey = Shift

   Select Case ShiftKey

       Case 1 ' или vbShiftMask

           Print "You pressed the SHIFT key."

       Case 2 ' или vbShiftMask

           Print "You pressed the CTRL key."

       Case 4 ' или vbShiftMask

           Print "You pressed the ALT key."

       Case 3

           Print "You pressed the SHIFT and CTRL."

       Case 5

           Print "You pressed the SHIFT and ALT."

       Case 6

           Print "You pressed the CTRL and ALT."

       Case 7

           Print "You pressed the SHIFT, CTRL, and ALT."

      End Select

End Sub

Если текстовое поле имеет фокус, нажатие каждой клавиши или комбинации клавиш генерирует соответствующее сообщение на форме.

Обработчики клавиатуры уровня формы

Каждое событие KeyDown и КеуUр присоединено к конкретному объекту. Чтобы написать обработчик клавиатуры, который применим ко всем объектам на форме, следует установить значение свойства KeyPreview формы равным True. Если это свойство установлено равным True, форма распознает события KeyPress, KeyUp и KeyDown для всех элементов управления на форме до того, как их распознают сами элементы управления. Это позволяет легко предоставить общий ответ на определенное нажатие клавиш.

Можно установить свойство KeyPreview формы равным True в окне Properties или в процедуре Form_Load:

Private Sub Form_Load()

   Form1.KeyPreview = True

End Sub

Можно проверять состояния клавиш, объявляя переменную ShiftKey и используя оператор Select Case. Следующая процедура будет печатать сообщение на форме независимо от того, какой элемент управления имеет фокус.

Откроем новый проект и добавим переменную ShiftKey в секцию Declarations формы:

Dim ShiftKey as Integer

Добавим текстовое поле и кнопку управления на форму. Добавим следующую процедуру к событию KeyDown формы:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   ShiftKey = Shift

   Select Case ShiftKey

       Case 1 ' или vbShiftMask

           Print "You pressed the SHIFT key."

       Case 2 ' или vbShiftMask

           Print "You pressed the CTRL key."

       Case 4 ' или vbShiftMask

           Print "You pressed the ALT key."

   End Select

End Sub

Если свойство Keypreview формы установлено равным True, форма распознает события клавиатуры раньше элементов управления, но эти события все же происходят для элементов управления. Чтобы предотвратить такое поведение, следует установить параметры KeyAscii и KeyCode процедур обработки событий клавиш для формы равными 0. Например, если на форме нет кнопки по умолчанию, можно использовать клавишу <Enter> для перемещения фокуса между элементами управления:

Private Sub Form_KeyPress(KeyAscii As Integer)

Dim NextTabIndex As Integer, i As Integer

   If KeyAscii = 13 Then

       If Screen.ActiveControl.TabIndex = Count - 1 Then

           NextTabIndex = 0

       Else

           NextTabIndex = Screen.ActiveControl.TabIndex + 1

       End If

       For i = 0 To Count - 1

           If Me.Controls(i).TabIndex = NextTabIndex Then

               Me.Controls(i).SetFocus

               Exit For

           End If

       Next i

       KeyAscii = 0

   End If

End Sub

Так как этот код обнуляет параметр KeyAscii, если он равен 13, элементы управления никогда не распознают, что нажата клавиша <Еntег>, и их процедуры обработки событий клавиш никогда не будут вызваны.

PAGE   \* MERGEFORMAT 2


 

А также другие работы, которые могут Вас заинтересовать

22105. Общие правила подчинения мест регулярного выражения 54.5 KB
  Определим вначале внутренние состояния в которые переходит автомат из состояния 0 при подаче на его вход сигнала x1. Следовательно автомат из состояния 0 под действием сигнала x1 переходит в состояние 2. Аналогично сигнал x2 переводит автомат из состояния 0 в состояние 1 т. Отсюда получаем следующую отмеченную таблицу переходов: yg e e e e e e y1 e y2 xj ai 0 1 2 3 4 5 6 7 8 x1 2 2 4 2 6 2 7 7 2 x2 1 1 3 1 5 1 8 8 1 yg E e e y1 e y2 xj ai A0 a1 a2 a3 a4 a5 x1 A1 a2 a3 a4 a4 a1 x2 A0 a0 a0 a5 a5 a0 Из построенной таблицы видно что из...
22107. Структурный синтез конечных автоматов 28 KB
  По таблице переходов автомата определяют к каким группам принадлежат внутренние состояния в которые автомат из данного состояния под воздействием каждой буквы входного алфавита. Эти состояния запишем в виде последовательности букв под каждым из состояний автомата. Например из состояния 0 автомат переходит в состояния 2 3 и 1 которые принадлежат соответственно к следующим группам a b и a. Проводят новое разделение внутренних состояний на группы объединяя в каждой группе состояния отмеченные одинаковой последовательностью букв.
22108. Элементарные автоматы 30.5 KB
  Таблица переходов Т триггера имеет вид: yg 0 1 xj ai 0 1 T=0 0 1 T=1 1 0 Из таблицы переходов видно что Ттриггер обладает полной системой переходов и выходов поскольку для каждой пары состояний 00 01 10 11 имеется входной сигнал обеспечивающий переход из одного состояния в другое. На практике более удобно вместо отмеченных таблиц переходов пользоваться так называемыми матрицами переходов элементарных автоматов. Матрица переходов определяет значения сигналов на входах элементарного автомата обеспечивающие каждый их четырех...
22109. D-триггер(триггер задержки) 28.5 KB
  Название Dтриггера происходит от слова €œdelay€ – задержка. Из определения следует что состояние триггера в момент времени t1 повторяет значение входного сигнала Dt в момент времени t отсюда и название триггера задержки. Матрица переходов для Dтриггера: D Qt Qt1 0 0 0 1 0 1 0 1 0 1 1 1 Обозначения асинхронного и синхронного Dтриггеров. Матрица переходов RS триггера имеет вид.
22110. J-K триггер (универсальный триггер) 24 KB
  Триггером JK типа называют автомат Мура с двумя устойчивыми состояниями и двумя входами J и K который при условии J K = 1 осуществляет инверсию предыдущего состояния т. при J K = 1 Qt1 = Qt а в остальных случаях функционируют в соответствии с таблицей истинности RS триггера при этом вход J эквивалентен входу S а вход K входу R. Этот триггер уже не имеет запрещенной комбинации входных сигналов и его таблица истинности т.
22111. Структурная схема конечного автомата 26.5 KB
  Комбинационная схема строится из логических элементов образующих функционально полную систему а память – на элементарных автоматах обладающих полной системой переходов и выходов. Каждое состояние абстрактного автомата ai i=0n кодируется в структурных автоматах набором состояний элементов памяти Q2 R=1R. Здесь Q – состояние автомата а ai = {0 1} Как и прежде Q Общее число необходимых элементов памяти можно определить из следующего неравенства 2R n 1.
22112. Табличный метод структурного синтеза конечных автоматов 75.5 KB
  На этапе структурного синтеза выбираем также способ кодирования состояний и выходных сигналов заданного автомата через состояния и выходные сигналы элементарных автоматов в результате чего составляют кодированные таблицы переходов и выходов. Функции возбуждения элементарных автоматов и функции выходов получаются на основе кодированной таблицы переходов и выходов. Рассмотрим примеры синтеза которые позволяют сформулировать общий алгоритм структурного синтеза конечных автоматов.
22113. Технические особенности конечных автоматов 36 KB
  Здесь u – сигналы возбуждения триггера. На практике триггера часто выполняются в синхронном варианте синхронные триггера когда упомянутые элементы u включают в схему триггера. Например схему синхронного триггера RSтипа можно рассматривать как состоящую из асинхронного RSтриггера ко входам R и S которого подключены двухвходовые элементы И. Очевидно синхронные триггера будут сохранять свои состояния при С=0 а переходы в них возможны при С=1 то переходы в синхронном триггере будут осуществляться также как в асинхронном.