netlib.narod.ru< Назад | Оглавление | Далее >

Клавиатура и мышь

Я уже говорил, как форма SimpleButton и кнопка реагируют на мышь. Если курсор расположен над кнопкой, она получает событие от мыши, если в другом месте клиентской области формы — событие от мыши получает форма. (Но не забудьте о захвате мыши: при щелчке над кнопкой кнопка захватывает мышь и продолжает получать все события от нее, пока кнопка мыши не будет отпущена или командная кнопка не потеряет захват мыши.)

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

В этом можно убедиться. Если вы переопределите в классе SimpleControl методы OnKeyDown, OnKeyUp и OnKeyPress, станет очевидно, что форма не получает событий нажатия клавиш. Можете установить обработчики событий KeyDown, KeyUp и KeyPress для кнопки. Для этого в класс SimpleButton нужно добавить примерно такие методы:

  void ButtonOnKeyDown(object obj, KeyEventArgs kea)
  {
      ...
  }

Также необходимо установить обработчики событий для кнопки, например так:

  btn.KeyDown += new KeyEventHandler(ButtonOnKeyDown);

Установив обработчики событий от клавиатуры для кнопки, вы увидите, что, когда окно программы SimpleButton активно, большинство событий нажатия клавиш передается кнопке. Сама по себе кнопка игнорирует большинство этих событий, кроме нажатия пробела.

Я сказал, что кнопка получает большинство клавиатурных событий. О нажатии некоторых клавиш ни кнопка, ни форма не узнают никогда. Такими событиями являются событие KeyDown для клавиш Enter, Tab и стрелок (вверх, вниз, влево и вправо), а также события KeyPress для клавиш Enter и Tab.

Клавиши-стрелки и Tab обычно служат для перемещения между элементами управления в диалоговых окнах Windows, а нажатие Enter обычно заставляет сработать кнопку по умолчанию. Нажатия этих клавиш перехватывает код в классе ContainerControl. Вы, наверное, помните, что ContainerControl — один из предков Form. Класс ContainerControl отвечает за передачу фокуса ввода между дочерними элементами управления. Поэтому класс типа Form, предназначенный для хранения набора элементов управления, часто называют контейнером элементов управления.

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


Свойства Control (выборочно)



Тип Свойство Доступ

bool Visible Чтение/запись
bool Enabled Чтение/запись


Обоим свойствам по умолчанию присваивается true. Если свойству Visible присвоить значение false, элемент управления исчезнет и не будет получать ввод с клавиатуры или мыши. Если элемент управления размещен на форме, ввод с мыши, который он должен был получать, получит форма, словно элемента управления там нет вовсе. Если невидимый элемент управления — единственный на форме, ввод с клавиатуры, как правило, получает форма.

Если свойству Enabled элемента управления присвоить значение false, элемент управления будет видим, но не будет отвечать на ввод с клавиатуры или мыши. Часто на блокировку элемента управления указывет серый цвет надписи на нем.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz