Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 2. Контрольная работа 1.doc
Скачиваний:
41
Добавлен:
01.04.2014
Размер:
202.24 Кб
Скачать

Вопрос 2. Обработка сообщений от мыши и клавиатуры. Понятие фокуса ввода.

  1. Фокус ввода

Все приложения, работающие одновременно под управлением Windows, должны иметь возможность получать данные от клавиатуры. Если какое-то приложение имеет более одного окна, то клавиатура должна разделяться и между окнами в рамках одного приложения. Это разделение Windows реализует, используя понятие фокуса ввода.

Фокус в широком смысле — концептуальное понятие в построении графического пользовательского интерфейса, означающее наличие у определённого элемента пользовательского интерфейса исключительного права принимать клавиатурный ввод.

Фокус ввода (keyboard focus) — это временное свойство окна, которое означает, что все сообщения от клавиатуры направляются именно этому окну. В каждый момент времени из всех окон, имеющихся на экране, только одно окно может иметь фокус ввода.

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

  1. Визуальных признаков элемента, которые сообщают пользователю, что именно этот элемент получит вводимые с клавиатуры данные,

  2. Внутренних данных приложения, позволяющих той части компьютерной системы, которая отвечает за диспетчеризацию клавиатурных событий, переадресовать клавиатурные события непосредственно элементу.

Говорят, что элемент обладает фокусом или фокус находится на элементе, если при возникновении клавиатурного события именно этот элемент среагирует определённым образом на событие. Чтобы пользователь мог определить, какой из элементов обладает фокусом, такой элемент обычно особым образом графически выделяется среди остальных аналогичных элементов.

Если система не предполагает наличие клавиатуры (даже виртуальной) как устройства ввода, или в любой момент времени существует только один элемент, способный реагировать на клавиатурные события, понятие «фокус» в таких системах не имеет смысла и не используется.

Не следует путать фокус с выделением — фокус распространяется на элементы интерфейса, в то время как выделение — на их содержимое.

Деактивированные элементы обычно не могут иметь фокуса.

Для увеличения удобства работы пользователю часто даётся несколько возможностей переключать фокус с одного элемента на другой. Разные операционные системы и приложения для них могут иметь разные способы. Обычно переместить фокус с одного элемента на другой можно при помощи определённых клавиш клавиатуры (например [Tab] и [Shift] + [Tab] для переключения фокуса на следующий/предыдущий элемент в Windows), либо при помощи мыши. Существуют различные модели переключения фокуса мышью: так, например, в Windows или MacOS элемент получает фокус после щелчка мышью на нём; в некоторых менеджерах окон X11 достаточно просто поместить указатель мыши над элементом, чтобы он получил фокус.

Фокусом ввода всегда владеет либо активное окно, либо одно из его дочерних окон. Часто дочерними окнами являются элементы управления — кнопки, переключатели, флажки, текстовые поля и списки, которые обычно размещаются в окне диалога. Элементы управления по-разному показывают, что они находятся в фокусе. Так, вокруг текста кнопки выводится точечная линия, а текстовое поле показывает, что оно получило фокус ввода, при помощи мигающего курсора.

Если активное окно минимизировано, то окна с фокусом ввода нет. Windows продолжает пересылать программе сообщения клавиатуры, но эти сообщения выглядят иначе, чем сообщения, направляемые активным неминимизированным окнам.

Функция окна может проследить за получением и потерей фокуса ввода. Когда окно получает фокус ввода, функции окна передается сообщение WM_SETFOCUS. Когда окно теряет фокус ввода, функции окна передается сообщение WM_KILLFOCUS. В ответ на эти сообщения функция окна не может запретить получение или потерю фокуса ввода, так что это сообщение носит чисто информирующий характер.

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

Функция HWND SetFocus(HWND hWnd) устанавливает фокус ввода на окно hWnd, возвращая дескриптор окна, которое располагало фокусом до вызова функции.

Функция HWND GetFocus() возвращает дескриптор окна, имеющего фокус ввода в текущий момент.