Лекция № 13

Тема: «Обработка событий клавиатуры и мыши»

 

План

1. События мыши и их параметры

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

3. Функции для работы с клавиатурой

4. Коды клавиш

 

1. События мыши и их параметры

В компонентах Delphi определен ряд событий, связанных с мышью. Приведем основные из них:

 

Событие

Описание

OnClick

Щелчок мыши на компоненте и некоторые другие действия пользователя.

OnDblClick

Двойной щелчок мыши на компоненте.

OnMouseDown

Нажатие клавиши мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

OnMouseMove

Перемещении курсора мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

OnMouseUp

Отпускание прежде нажатой кнопки мыши над компонентом. Возможно распознавание нажатой кнопки и координат курсора мыши.

OnMouseWheel

Событие при вращении колесика мыши в любую сторону

OnMouseWheelUp

Вращение колесика мыши вверх. Наступает, если вращение не обработано в событии OnMouseWheel

OnMouseWheelDown

Вращение колесика мыши вниз. Наступает, если вращение не обработано в событии OnMоuseWheel

 

Событие OnMouseMove возникает при наведении мыши на компонент. Это событие можно использовать для создания "живого" интерфейса, когда компонент меняет свое оформление при наведении на него мышью.

Например. Пусть имеется поле Edit1. При наведении на него мышью фон поля меняется, а при наведении на форму – принимает исходный цвет.

В событии поля OnMouseMove напишем код:

 

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

//устанавливаем цвет фона для поля

Edit1.Color:=clYellow;

end;

 

В событии формы OnMouseMove напишем код:

 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

begin

  //возвращаем для поля начальный белый цвет

  Edit1.Color:=clWhite;

end;

 

Это же событие можно использовать для информирования в строке статуса о назначении компонента, на который наведена мышь.

Например. Пусть имеется поле Edit1. При наведении на него мышью в строке статуса появляется текст "Текстовое поле", а при наведении на форму – текст исчезает.

 

В событии поля OnMouseMove напишем код:

 

 

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

//в строке статуса отображаем текст

StatusBar1.SimpleText:='Текстовое поле';

end;

 

В событии формы OnMouseMove напишем код:

 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

begin

//в строке статуса очищаем текст

StatusBar1.SimpleText:='';

end;

 

В некоторые обработчики событий мыши передаются параметры Button, Shift, X и Y.

 

Пусть имеется список ListBox1. Если щелкнуть на нем Alt+левая кнопка мыши, то список очищается, если щелкнуть Crtl+левая кнопка мыши, то список меняет цвет фона, если щелкнуть Alt+Shift+правая кнопка мыши, то список скрывается с формы.

 Обработчик можно написать в событии списка OnMouseDown или OnMouseUp.

 

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

//если нажаты Alt+левая кнопка мыши

if (Button=mbLeft) and (ssAlt in Shift) then

ListBox1.Clear

//если нажаты Crtl+левая кнопка мыши

else if (Button=mbLeft) and (ssCtrl in Shift) then

ListBox1.Color:=clYellow

//если нажатые Alt+Ctrl+левая кнопка мыши

else if (Button=mbLeft) and (ssAlt in Shift) and (ssCtrl in Shift) then

Listbox1.Visible:=false;

end;

 

Большинство оконных компонентов – многострочные окна редактирования, списки и т.п. имеют обработчики вращений колесика мыши по умолчанию. Это относится к Memo, RichEdit, ListBox и многим другим, в том числе и к формам. Правда, в некоторых из них, например, в Memo, эти обработчики по умолчанию будут срабатывать только в том случае, если в компоненте заданно отображение полос прокрутки (то есть это обработчики не самых элементов, а полос прокрутки).

Обработчики по умолчанию обеспечивают при вращении колесика сдвиг содержимого в соответствующем направлении. Так что писать обработчики событий, связанных с колесиком, имеет смысл только в случаях, когда надо обеспечить нестандартную реакцию компонента. Например: с помощью колесика мыши обеспечить уменьшении формы при вращении колесика вниз, и увеличении формы при вращении колесика вверх.

В событии формы OnMouseWheelDown напишем код:

 

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;   MousePos: TPoint; var Handled: Boolean);

begin

        //уменьшаем ширину формы

        form1.Width:=form1.Width-10;

        //уменьшаем высоту формы

        form1.Height:=form1.Height-10;

end;

 

В событии формы OnMouseWheelUp напишем код:

 

procedure TForm1.FormMouseWheelUp(Sender: Tobject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);

begin

        //увеличиваем ширину формы

        form1.Width:=form1.Width+10;

        //увеличиваем высоту формы

        form1.Height:=form1.Height+10;

end;

 

 При таком подходе необходимо, чтобы форма имела ограничение на минимальные и максимальные значения ширины и высоты (свойство формы Constraints). А если нет, то  форма может уменьшаться до заголовка, а увеличиваться за границы окна.

 

Перетаскивание  информации

Код перетаскивания нужно писать в событии OnMouseDown компонента, который перетаскивается. Сам код имеет вид:

 

ReleaseCapture();

(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);

 

Код является универсальным и может использоваться для любого компонента. Например: организуем перетаскивание кнопки по форме с помощью комбинации Alt+левая кнопка мыши.

В событии кнопки OnMouseDown напишем код:

 

if (Button=mbLeft) and (ssAlt in Shift) then

begin

ReleaseCapture();

(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);

end;

 

Например: организовать перетаскивание формы по экрану за любое свободное место на ней.

В событии формы OnMouseDown напишем код:

 

if (Button=mbLeft) and (ssAlt in Shift) then

begin

ReleaseCapture();

(Sender as TControl).Perform(WM_SYSCOMMAND, $f012,0);

end;

 

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

В компонентах Delphi определено три события, связанных с клавиатурой. Это события:

Событие

Описание

OnKeyDown

Событие наступает при нажатии пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ нажатой клавиши.

OnKeyPress

Событие наступает при нажатии пользователем клавиши символа. Можно распознать только нажатую клавишу символа, различить символ в верхнем и нижнем регистре, различить символы кириллицы и латинские, но нельзя распознать функциональные клавиши.

OnKeyUp

Событие наступает при отпускании пользователем любой клавиши. Можно распознать нажатые клавиши, включая функциональные, но нельзя распознать символ клавиши, которая отпускается.

 

По умолчанию форма не реагирует на нажатие клавиш. Даже, если написать обработчики для нужных событий, то они не будут работать, пока не установить для формы свойство KeyPreview=true.

События OnKeyUp и OnKeyDown имеют одинаковые параметры:

Параметр Key является целым числом, определяющим клавишу, а не символ. Например, один и тот же код соответствует прописному и строчному символам "Y" и "y". Если, как это обычно бывает, в русской клавиатуре этой клавише соответствуют символы кириллицы "Н" и "н", то их код будет тем же самым. Различить прописные и строчные символы или символы латинские и кириллицы невозможно.

Проверять нажатую клавишу можно, сравнивая Key с целым десятичным кодом клавиши, приведенном во втором столбце справочной таблицы. Например, реакцию на нажатие пользователем клавиши Enter можно оформить оператором:

 

if  (Key = 13) then   . . . ;

 

Можно сравнивать Key и с шестнадцатиричным эквивалентом кода, приведенным в третьем столбце справочной таблицы. Например, приведенный выше оператор можно записать в виде:

 

if (Key = $0D)  then  . . .;

 

Для клавиш, которым не соответствуют символы, назначены также именованные константы, которые облегчают написание программы, поскольку не требуют помнить числовые коды клавиш. Например, приведенный выше оператор можно записать в виде:

 

if   (Key = VK_RETURN) then . . .;

 

Для клавиш символов и цифр можно делать проверку сравнением с десятичным или шестнадцатилетним кодом, но это не очень удобно, потому что тяжело помнить коды разных символов. Другой способ – воспользоваться функцией Ord, которая определяет код символа. Коды латинских символов в верхнем регистре совпадают с виртуальными кодами, используемыми в параметре Key. Поэтому, например, если вы хотите распознать клавишу, соответствующую символу "Y", вы можете написать:

 

if (key = Ord('Y') then . . . ;

 

В этом операторе можно использовать только латинские символы в верхнем регистре. Если вы напишете ОRD('y') или захотите написать русские символы, соответствующие этой клавише – ORD('H') или Ord('н'), то оператор на сработает.

Приведем пример распознавания комбинации клавиш. Пусть вы хотите, например, распознать комбинацию Alt+X, Для этого вы можете написать оператор:

 

if (Key = Ord('X')) and (ssAlt in Shift) then . . . ;

 

Мы рассмотрели распознавание клавиш в события OnKeyDown. Заголовок обработчика события OnKeyUp имеет такой же вид, так что все сказанное в равной мере относится и к событиям при отпускании клавиш.

Рассмотренные события можно использовать для присваивания «горячих» клавиша для доступа к элементам на форме.

Пример. Пусть на форме есть два переключателя (RadioButton1 и RadioButton2). Написать код, который переключает эти элементы с помощью комбинаций Alt+F1 и Alt+F2.

В событии формы OnKeyDown напишем код:

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

//если нажаты Alt+F1

if (Key=VK_F1) and (ssAlt in Shift) then

//включаем первый переключатель

RadioButton1.Checked:=true

//если нажаты Alt+F2

else if (Key=VK_F2) and (ssAlt in Shift) then

//включаем второй переключатель

RadioButton2.Checked:=true

end;

 

Пример. Пусть на форме имеется фляжок CheckBox1. Написать код, который переключает флажок с помощью комбинации Ctrl+1.

В событии формы OnKeyDown напишем код:

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

//если нажата комбинации Ctrl+1

if (Key=ord('1')) and (ssCtrl in Shift) then

//флажок переводится в противоположное состояние

CheckBox1.Checked:=not CheckBox1.Checked;

end;

 

Событие OnKeyPress

Теперь перейдем к рассмотрению события OnKeyPress. В этот обработчик, как и в описанные выше, передается параметр Key, но это не виртуальный код клавиши, а символ, по которому можно определить, прописная это буква, или строчная, русская, или латинская.

Пусть, например, вы задали пользователю вопроса, на который он должен ответить символами "Д" или "д" (да), или символами "Н" или "н" (нет). Тогда распознать утвердительный ответ в обработчике события OnKeyPress можно оператором:

 

if ((Key= 'Д') or (Key='д')) then . . .

. . .

else if ((Key= 'Н') or (Key='н')) then . . .

. . . ;

 

Этот же пример можно реализовать с помощью оператора case.

 

case key of

'Д', 'д':  . . . ;

'Н', 'н':  . . . ;

else

    windows.beep(150,250);

end;

 

Здесь предусмотренная реакция на положительный и отрицательный ответ, а также звуковой сигнал при ошибочном ответе.

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

Пример. Пусть имеется текстовое поле Edit1. Необходимо, чтобы в поле можно было ввести только русские буквы, пробел и тире.

Для наложения такого ограничения нужно в событии OnKeyPress поля ввести код:

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if not (Key in ['А'..'я','-']) then

    begin

             Key:=#0;

             windows.beep(150,250);

    end

end;

 

Если введенный символ не русская буква и не тире, то этот символ заменяется на пустой и не отображается в поле.

Пример. Пусть в поле Edit1 нужно разрешить вводить буквы на двух алфавитах. Диапазон запрещенных символов нужно изменить

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if not (key in ['A'..'я','А'..'я', '-']) then

    begin

             key:=#0;

             windows.beep(150,250);

    end

end;

 

Пример. Иногда нужно не только ограничить ввод только буквами, но и сделать так, чтобы буквы, которые вводятся, автоматически заменялись на прописные или строчные. В этом случае рассмотренный раньше фрагмент кода можно дополнить так:

 

// для замены текста на прописные буквы

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var s:string;

begin

if not (Key in ['А'..'я','-']) then

    begin

             Key:=#0;

             windows.beep(150,250);

    end

    else

    begin

         s:=Key;

         Key:=AnsiUpperCase(s)[1];

    end;

end;

 

// для замены текста на строчные буквы

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var s:string;

begin

if not (Key in ['А'..'я','-']) then

    begin

             Key:=#0;

             windows.beep(150,250);

    end

    else

    begin

         s:=Key;

         Key:=AnsiLowerCase(s)[1];

    end;

end;

 

Пример. Если в поле нужно ограничить ввод только цифрами, десятичной точкой, и знаком числа "-", то код может иметь вид:

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var ch:char;

begin

//записываем в переменную принятый в ОС разделитель

ch=DecimalSeparator;

//если введенная точка или запятая,

//то ее заменяем на разделитель, принятый в ОС пользователя

if (Key='.') or (Key=',') then

Key:=ch;

 

//если символ не цифра, не разделитель, не минус и не BackSpace

if not (Key in ['0'..'9',ch,'-',#8])

//или, если разделитель уже введен

or ((Key=ch)and(Pos(ch,Edit1.Text)>0))

//или, если минус уже введен

or ((Key='-')and(Pos('-',Edit1.Text)>0))

//или, если введенный минус не в начале числа

or ((Key='-')and(Edit1.SelStart>0)) then

begin

Key:=#0;

windows.beep(150,250);

end

end;

 

В этом примере используется функция Pos(s1,s2). Данная функция ищет вхождение строки s1 в строку s2. Если строка найдена, то функция равняется номеру символа, с которого начинается вхождение. Если строка не найдена, то функция равная 0.

Например:

 

var s2:string;

. . .

begin

. . .

s2:=’информатика’;

Pos(‘форма’, s2) = 3

Pos(‘пример’, s2) = 0

 

В последнем условии используется свойство текстового поля SelStart, в котором хранится положения курсора в поле (нумерация с 0). Поэтому, если SelStart не 0, то это означает, что мы вводим символ "-" не в первой позиции, что недопустимо для числа.

 

3.Функции для работы с клавиатурой

Изменение языка при входе в поле

Для облегчения работы пользователя с программой можно предусмотреть автоматическое переключение языка клавиатуры при входе в поле или при запуске программы. В первом случае код нужно писать для события OnEnter текстового поля. Это событие наступает при получении полем фокуса. Во второму случае код нужно писать в событии OnCreate нужной формы. Сам код имеет вид (пример для события OnEnter):

 

procedure TForm1.Edit1Enter(Sender: TObject);

begin

//переключаем клавиатуру на русский язык

LoadKeyboardLayout('00000419',klf_activate);

end;

 

Для переключения на другие языки нужно в команде указать соответствующий код языка:

00000422 – украинский язык;

00000409 – английский язык;

0000040С – французский язык;

00000407 – немецкий язык.

 

Определение текущего языка клавиатуры

Для проверки текущего языка клавиатуры использую функцию вида:

 

if GetKeyboardLayout(0) = код языка then

 

где код языка может принимать значения:

67699721 - английский язык;

68748313 - украинский язык;

4039115810 - русский язык.

 

Пример. Пусть в строке статуса в первой панели нужно отображать текущий язык клавиатуры. В событии формы OnKeyDown напишем код:

 

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

    //если активный язык - английский

    if GetKeyboardLayout(0) = 67699721 then

       StatusBar1.Panels[0].Text:='EN'

    //иначе, если активный язык - русский

    else if GetKeyboardLayout(0) = 68748313 then

        StatusBar1.Panels[0].Text:='RU'

    //иначе, если активный язык - украинский

    else if GetKeyboardLayout(0) = 4039115810 then

        StatusBar1.Panels[0].Text:='UA'

end;

 

Распознавание состояния специальных клавиш

Стандартные события клавиатуры OnKeyDown, OnKeyUp и OnKeyPress имеют ограничения на распознавание нажатия клавиш. Например, они не могут распознать нажатие или отпускание клавиш CapsLock, NumLock, Insert, ScrollLock.

Для выполнения такого распознавания можно использовать функцию GetKeyState, которая записывается в виде:

 

if (GetKeyState (клавиша) and 1)=1 then

      клавиши включена

else

 клавиши выключена

 

Клавиша – это обозначение из таблицы кодов клавиш (см. следующий раздел лекции).

Пример. Пусть имеется строка статуса, которая состоит из 4 панелей. Нужно при каждом нажатии на клавишу CapsLock отображать в четвертой панели состояние этой клавиши: текст «CAPS» – если клавиши включена и пустой символ – если выключена. В событии формы OnKeyUp напишем код:

 

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;  Shift: TShiftState);

begin

//если клавиша включена

if (GetKeyState(VK_CAPITAL) and 1) = 1 then

//то отображаем текст в 4 панели (нумерация панелей начинается с 0)

Statusbar1.Panels[3].Text:='CAPS'

//иначе, если клавиша выключена

else

//удаляем текст из панели

Statusbar1.Panels[3].Text:=''

end;

 

Программное нажатие на клавише

Существует возможность программно эмулировать нажатие клавиш на клавиатуре. При этом компьютер обработает данное нажатие так же, как если бы клавишу нажал пользователь. Для реализации такой возможности всегда используют пару команд:

 

//нажатие клавиши

keybd_event (клавиша, MapVirtualKey(клавиша,0), 0, 0);

//отпускание клавиши

keybd_event (клавиша, MapVirtualKey(клавиша,0), keyeventf_keyup, 0);

 

Клавиша - это обозначения из таблицы кодов клавиш (см. следующий раздел лекции).

Пусть при открытии формы нужно включить клавишу NumLock, если она была выключена. Для этого в событии формы OnCreate напишем код:

 

procedure TForm1.FormCreate(Sender: TObject);

begin

//если клавиша выключена

if (GetKeyState(VK_NUMLOCK) and 1) = 0 then

begin

//нажимаем ее

keybd_event(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),0,0);

//и отпускаем

keybd_event(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),keyeventf_keyup,0);

end;

end;

 

Распознавание левой и правой специальной клавиши

Функция GetKeyState позволяет также распознать, которую именно из двух специальных клавиш нажал пользователь: левую или правую. Для этого используют оператор вида:

 

if GetKeyState (VK_LSHIFT)<>0 then

//нажат левый Shift

 

или

 

if GetKeyState (VK_RSHIFT)<>1 then

//нажат правый Shift

 

Пример. Пусть имеется два переключателя RadioButton1 и RadioButton2. Первый из них нужно включать комбинацией LeftAlt+1, а второй – RightAlt+1. Для этого в событии формы OnKeyDown напишем код:

 

procedure TForm1.FormKeydown(Sender: TObject; var Key: Word;  Shift: TShiftState);

begin

//если нажата клавиша "1"

if key=ord('1') then

begin

//если нажат левый Alt

if (GetKeyState(VK_LMENU)<>0) then

//включаем первый переключатель             

RadioButton1.Checked:=true

//если нажат правый Alt

else if (GetKeyState(VK_RMENU)<>1) then

//включаем второй переключатель

RadioButton2.Checked:=true ;

end;

end;  

 

4. Коды клавиш

Ниже приведеные коды клавиш, которыми можно пользоваться при проверке параметра Key в обработчиках событий OnKeyDown и OnKeyUp, при записи строк и в ряде других случаев. Символы кириллицы отвечают тем клавишам с латинскими символами, на которые они размещены.

 

Клавиши

Десятичное число

Шестнадцатиричное число

Символическое имя

Сравнение по функции ord

F1

112

$70

VK_F1

 

F2

113

$71

VK_F2

 

F3

114

$72

VK_F3

 

F4

115

$73

VK_F4

 

F5

116

$74

VK_F5

 

F6

117

$75

VK_F6

 

F7

118

$76

VK_F7

 

F8

119

$77

VK_F8

 

F9

120

$78

VK_F9

 

F10

121

$79

VK_F10

 

пробел

32

$20

VK_SPACE

 

Backspace

8

$8

VK_BACK

 

Тab

9

$9

VK_TAB

 

Enter

13

$0D

VK_RETURN

 

Shift

16

$10

VK_SHIFT

 

Ctrl

17

$11

VK_CONTROL

 

Alt

18

$12

VK_MENU

 

CapsLock

20

$14

VK_CAPITAL

 

Esc

27

$1В

VK_ESCAPE

 

Insert

45

$2D

VK_INSERT

 

PageUp

33

$21

VK_PRIOR

 

PageDown

34

$22

VK­ _NEXT

 

End

35

$23

VK_END

 

Home

36

$24

VK_HOME

 

37

$25

VK_LEFT

 

38

$26

VK_UP

 

39

$27

VK_RIGHT

 

40

$28

VK_DOWN

 

Delete

46

$2Э

VK_DELETE

 

PrintScreen

44

$2С

VK_SNAPSHOT

 

ScrollLock

145

$91

VK_SCROLL

 

Pause

19

$13

VK_PAUSE

 

NumLock

144

$90

VK_NUMLOCK

 

0, )

48

$30

 

ord(‘0’)

1, !

49

$31

 

ord(‘1’)

2, @

50

$32

 

ord(‘2’)

3, #

51

$33

 

ord(‘3’)

4, $

52

$34

 

ord(‘4’)

5, %

53

$35

 

ord(‘5’)

6,

54

$36

 

ord(‘6’)

7, &

55

$37

 

ord(‘7’)

8, *

56

$38

 

ord(‘8’)

9, (

57

$39

 

ord(‘9’)

`, ~

192

$ С0

 

 

-, _

189

$BD

 

 

=, +

187

$ВВ

 

 

[, {

219

$DB

 

 

], }

221

$DD

 

 

; :

186

$ВА

 

 

‘, “

222

$DE

 

 

\, |

220

$DC

 

 

, <

188

$ВР

 

 

. >

190

$ВE

 

 

/, ?

191

$BF

 

 

а, А

65

$41

 

ord('A')

b,B

66

$42

 

ord(B')

c,C

67

$43

 

ord(‘C’)

d,D

68

$44

 

ord('D')

e,E

69

$45

 

ord('E')

f, F

70

$46

 

ord('F')

g, G

71

$47

 

ord('G')

h,H

72

$48

 

ord('H')

i, I

73

$49

 

ord('I')

j, J

74

$4А

 

ord(‘J’)

k, K

75

$4В

 

ord('K')

l, L

76

$4С

 

ord('L')

m, M

77

$4D

 

ord(‘M’)

n, N

78

$4Э

 

ord(‘N’)

o, O

79

$4F

 

ord('O')

p, P

80

$50

 

ord('P')

q, Q

81

$51

 

ord('Q')

r, R

82

$52

 

ord('R')

s, S

83

$53

 

ord(‘S’)

t, T

84

$54

 

ord('T')

u, U

85

$55

 

ord('U')

v, V

86

$56

 

ord('V')

w, W

87

$57

 

ord('W')

x, X

88

$58

 

ord('X')

y, Y

89

$59

 

ord('Y')

z, Z

90

$5А

 

ord(‘Z’)

 На правой клавиатуре при исключенной клавише NumLock

0

96

$60

VK_NUMPAD0

 

1

97

$61

VK_NUMPAD1

 

2

98

$62

VK_NUMPAD2

 

3

99

$63

VK_NUMPAD3

 

4

100

$64

VK_NUMPAB4

 

5

101

$65

VK_NUMPAD5

 

6

102

$66

VK_NUMPAD6

 

7

103

$67

VK_NUMPAD7

 

8

104

$68

VK_NUMPAD8

 

9

105

$69

VK_NUMPAD9

 

*

106

$6А

VK_MULTIPLY

 

+

107

$6В

VK_ADD

 

-

109

$6D

VK_SUBTRACT

 

.

110

$6Э

VK_DECIMAL

 

/

111

$6F

VK_DIVIDE

 

 

Вопросы для самоконтроля

 

1. Опишите события OnMouseDown, OnMouseUp, OnMouseMove. Какие параметры имеют эти события?

2. Опишите события OnMouseWheelUp, OnMouseWheelDown.

3. Как выполнить перетаскивание формы по экрану за свободное место на ней?

4. Дайте характеристику событиям OnKeyDown, OnKeyUp. Какие  параметры имеют эти события?

5. Какие способы определения нажатой клавиши вы знаете?

6. Дайте характеристику события OnKeyPress. Какой параметр она имеет?

7. Приведите код ограничения поля на ввода только целых чисел.

8. Приведите команду переключения языков на клавиатуре.

9. Как определить состояние специальных клавиш NumLock, CapsLock, Insert.

10. Приведите команды программного нажатия на клавишу.

11. Как распознать нажатие левой или правой специальной клавиши?