1.3.2 Мышь
1.3.2 Мышь
С точки зрения программы общение с мышью похоже на работу с клавиатурой. X получает сигналы от устройства, преобразует их в события и помещает последние в очередь программы. Однако есть и существенная разница. Если события от клавиатуры передаются лишь программе, окно которой имеет фокус ввода, то события от мыши могут передаваться, в принципе, любой задаче, окно (окна) которой присутствуют на экране.
Чаще всего приходится обрабатывать события нажатия (отпускания) кнопки мыши. Для регистрации такого типа событий, необходимо добавить одну из следующих масок с помощью функции XSelectInput():
• ButtonPressMask - уведомлять о нажатии любой кнопки в одном из окон программы.
• ButtonReleaseMask - уведомлять об отпускании любой кнопки в одном из окон программы.
В цикле обработки сообщений могут проверяться такие события:
• ButtonPress - нажата кнопка в одном из окон программы.
• ButtonRelease - отпущена кнопка в одном из окон программы.
Структура для этих сообщений получается доступом к полю xbutton объединения TXEvent и содержит, в частности, такие поля:
• window: TWindow - идентификатор окна, которому было послано сообщение (в случае, если оно было зарегистрировано для нескольких окон программы).
• x, y: longint - координаты x и y (в пикселях) мышиного курсора в момент нажатия.
• button: cardinal - номер нажатой кнопки (может принимать значения Button1, Button2, Button3).
• time: TTime - время (в миллисекундах), которое длилось событие. Может использоваться для определения "двойного щелчка".
В качестве примера приведем фрагмент кода, в котором рисуется черный пиксель в позиции мыши всякий раз, когда мы получаем событие "нажатие кнопки" от первой кнопки мыши, и стирается пиксель (то есть рисуется белый), когда нажата вторая кнопка мыши. Предполагается существование двух GC: gc_draw с черным цветом переднего плана и gc_erase с белым цветом переднего плана.
…
ButtonPress:
begin
(* сохраняем координаты кнопки мыши в целых переменных *)
(* также сохраняем идентификатор окна, в котором была нажата кнопка мыши *)
x:= an_event.xbutton.x;
y:= an_event.xbutton.y;
the_win:= an_event.xbutton.window;
(* проверяем, какая из кнопок была нажата, и действуем соответственно *)
case (an_event.xbutton.button) of
Button1:
(* рисуем пиксель в позиции мыши *)
XDrawPoint(display, the_win, gc_draw, x, y);
Button2:
(* стираем пиксель в позиции мыши *)
XDrawPoint(display, the_win, gc_erase, x, y);
else (* возможно, третья кнопка - игнорируем *)
;
end;
end;
…
Подобно событиям нажатия и отпускания кнопки мыши, нас также могут извещать о различных событиях перемещения мыши. Они делятся на два семейства. Первое - перемещение указателя мыши, пока никакие кнопки не нажимаются, и второе - движение указателя мыши при одной (или более) нажатых кнопках (это иногда называется операцией "перетаскивания" (drag)). Следующие маски событий должны быть добавлено в вызов XSelectInput() для получения извещений о таких событиях:
• PointerMotionMask - события указателя, перемещающегося в одном из окон программы, когда ни одна кнопка мыши не нажата.
• ButtonMotionMask - события перемещения указателя, пока одна (или более) кнопок мыши удерживается нажатой.
• Button1MotionMask - тоже, что и ButtonMotionMask, но только когда первая кнопка мыши удерживается нажатой.
• Button2MotionMask, Button3MotionMask, Button4MotionMask, Button5MotionMask - аналогично для кнопок 2, 3, 4 или 5.
В цикле обработки сообщений проверяется событие MotionNotify - указатель мыши перемещался в одном из окон, для которых мы запросили уведомление о таких событиях.
Структура для этих сообщений получается доступом к полю xmotion объединения TXEvent и содержит, в частности, такие поля:
• window: TWindow - идентификатор окна, которому было послано сообщение движения мыши (в случае, если оно было зарегистрировано для нескольких окон программы).
• x, y: longint - координаты x и y (в пикселях) мышиного курсора в момент генерации сообщения.
• state: cardinal - маска кнопок (или клавиш), удерживаемых во время этого события (если таковые имеются). Эта поле - побитовое "ИЛИ" любого из следующих значений: Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask, ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask. Первые пять значений ссылаются на кнопки мыши, которые нажимаются, остальные соответствуют различным специальным клавишам (Mod1 - обычно клавиша Alt или Meta).
• time: TTime - время (в миллисекундах), которое длилось событие.
Как пример, следующий код определяет режим рисования для графического редактора, в котором, если пользователь перемещает мышь, удерживая первую ее кнопку, мы рисуем на экране. Этот код имеет недостаток: поскольку перемещение мыши может генерировать много событий, вполне возможно, что мы не получим событие движения мыши для каждого пикселя, над которым проходит мышь. Один из способов разрещения этой ситуации состоит в запоминании последнего пикселя, над которым была "протащена" мышь, и рисованием линии между запомненной и новой позициями указателя мыши.
…
MotionNotify:
begin
(* сохраняем координаты кнопки мыши в целых переменных также сохраняем идентификатор окна, в котором была протащена мышь *)
x:= an_event.xmotion.x;
y:= an_event.xmotion.y;
the_win:= an_event.xbutton.window;
(* если первая кнопка мыши удерживалась во время этого события, рисуем пиксель в позиции мышиного курсора *)
if (an_event.xmotion.state AND Button1Mask) then begin
XDrawPoint(display, the_win, gc_draw, x, y);
end;
end;
…
Другой тип мышиных событий - вход указателя мыши в окно программы или выход из окна. Некоторые программы используют эти события, чтобы показать пользователю, что приложение получило фокус. Для регистрации событий этого типа необходимо добавить одну (или более) из следующих масок в функции XSelectInput():
• EnterWindowMask - уведомлять, когда указатель мыши входит в любое из окон программы.
• LeaveWindowMask - уведомлять, когда указатель мыши выходит из окна программы.
В цикле обработки сообщений проверяется одно из следующих событий:
• EnterNotify - указатель мыши только что вошел в одно из окон программы.
• LeaveNotify - указатель мыши только что вышел из окна программы.
Структура для этих сообщений получается доступом к полю xcrossing объединения TXEvent и содержит, в частности, такие поля:
• window: TWindow - идентификатор окна, которому было послано сообщение от мыши (в случае, если оно было зарегистрировано для нескольких окон программы).
• subwindow: TWindow - идентификатор дочернего окна ребенка, из которого мышь перешла в текущее (в событии EnterNotify), или в которое указатель мыши переместился (в событии LeaveNotify), или None, если мышь переместилась за пределы окон программы.
• x, y: longint - координаты x и y (в пикселях) мышиного курсора в момент генерации сообщения.
• mode: longint - номер нажатой кнопки (может принимать значения Button1, Button2, Button3).
• time: TTime - время (в миллисекундах), которое длилось событие. Может использоваться для определения "двойного щелчка".
• state: cardinal - маска кнопок (или клавиш), удерживаемых во время этого события (если таковые имеются). Эта поле - побитовое "ИЛИ" любого из следующих значений: Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask, ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask. Первые пять значений ссылаются на кнопки мыши, которые нажимаются, остальные соответствуют различным специальным клавишам (Mod1 - обычно клавиша Alt или Meta).
• focus: TBool - устанавливается в True, если окно имеет клавиатурный фокус, и False в противном случае.
Обычно фокус ввода может свободно переходить от окна к окну. Но иногда программе необходимо запретить передачу фокуса. Это называется захватом клавиатуры. Для того, чтобы его реализовать, используется процедура XGrabKeyboard().
Функция XGrabKey() запрещает передачу фокуса после нажатия определенной комбинации клавиш. Освободить клавиатуру можно, обратившись к процедуре XUngrabKeyboard() (XGrabKey()).
Рассмотрим поведение системы при обработке событий от мыши. Как правило, если ее кнопка нажата в момент, когда ее курсор находится в неактивном окне, то последнее активизируется, и события от мыши передаются ему. Сказанное означает, что в нормальном состоянии окно получает только те события от мыши, которые соответствуют сигналам, пришедшим тогда, когда ее курсор находится в пределах окна. Но если программа вызывает
function XGrabPointer(prDisplay: PDisplay; nGrabWnd: TWindow; nOwnerEvents: TBool; nEventMask: cardinal; nPointerMode: longint; nKeyboardMode: longint; nConfineTo: TWindow; nCursor: TCursor; nTime: TTime): longint; cdecl; external;
то положение меняется. Теперь все события будут направляться окну с дескриптором nGrabWnd. Освобождается мышь вызовом XUngrabPointer(). Процедура XGrabButton() указывает, что курсор должен быть захвачен после нажатия определенной кнопки. Обратной к ней является процедура XUngrabButton().
Процедуры, захватывающие устройство - мышь или клавиатуру - имеют ряд аргументов, влияющих на поведение системы.
Так, параметр nConfineTo есть идентификатор окна, за пределы которого не должен выходить курсор мыши, если он захвачен.
Если аргумент nOwnerEvents равен Тrue, то события мыши будут передаваться окнам программы. Если nOwnerEvents - False, или курсор находится в окне, не принадлежащем программе, то события мыши передаются окну nGrabWnd.
Если nOwnerEvents равен False, то параметр nEventMask указывает, какие события следует передавать окну nGrabWnd.
Обработка событий от клавиатуры или ныши может быть приостановлена, если nPointerMode или nKeyboardMode равен GrabModeSync. В этом случае события буферизуются сервером, пока устройство не будет освобождено с помощью XUngrabKeyboard(), XUngrabKey(), XUngrabPointer() или XUngrabButton().
Параметр nCursor задает форму курсора во время того, как мышь захвачена. Аргумент nTime указывает, когда система должна активизировать режим захвата.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Мышь
Мышь Мышь лучше покупать оптическую. В этом случае отпадает необходимость регулярно чистить механические части манипулятора от пыли.Коврик для оптической мыши покупайте однотонный. Понимаю, что с полуобнаженной красоткой или потешным зверьком заманчивее. Однако при
9.4. Мышь
9.4. Мышь Существуют два основных типа мышей - подключаемые через последовательный порт (serial mice) и подключаемые к шине (bus mice). Большинство компьютеров оборудуются в настоящее время мышами второго типа. Дальнейший текст относится к bus-мышам и основан на Busmouse HOWTO Криса
1.5.4. Не определяется мышь
1.5.4. Не определяется мышь Если программа установки не смогла определить мышь, вы увидите соответствующее сообщение. При этом вам будет предложено продолжить установку в текстовом режиме, который не требует мыши. Проверьте, работает ли мышь вообще (на другом
Мышь
Мышь Этот механизм не претерпел практически никаких изменений еще с Windows 98. Он позволяет управлять самым используемым устройством, подключенным к компьютеру, – манипулятором «мышь». С его помощью вы можете настраивать основные параметры манипулятора: скорость
15. Мышь и клавиатура
15. Мышь и клавиатура Клавиатура была основным устройством ввода данных со времени появления персональных компьютеров. Хотя клавиатура с тех самых пор почти не изменилась, появились некоторые новшества.Клавиатура Microsoft Natural (и подобные ей) разработана для преодоления
Мышь и стилус
Мышь и стилус Взаимодействие с программой пользователь осуществляет с помощью стилуса или аппаратных кнопок на самом устройстве. А где же мышь и клавиатура? Ну, предположим, что клавиатуру можно заменить ее виртуальным аналогом на экране КПК. Она имеет практически ту же
3.1. Мышь
3.1. Мышь Начнем с простых операций с мышью. Вероятно, простота этого средства определяет то, как легко использовать в программе данные, получаемые от мыши. Поэтому при работе с мышью большинство сложностей состоит именно в особых алгоритмах обработки данных, а не в
1.3.2 Мышь
1.3.2 Мышь С точки зрения программы общение с мышью похоже на работу с клавиатурой. X получает сигналы от устройства, преобразует их в события и помещает последние в очередь программы. Однако есть и существенная разница. Если события от клавиатуры передаются лишь программе,
3.2. Клавиатура и мышь
3.2. Клавиатура и мышь Существует несколько недокументированных возможностей настройки работы мыши и клавиатуры. В этом разделе мы рассмотрим эти
Мышь и ее ближайшие «родственники»
Мышь и ее ближайшие «родственники» Как вы уже наверняка поняли, при бешеной скорости развития компьютерной техники устройства управления «железным другом» принципиальных изменений не претерпели. Менялись внешний вид, технология изготовления, но пользователи
Мышь
Мышь Манипулятор «мышь» (рис. 2.36) – это внешнее устройство, предназначенное для облегчения ввода информации. С помощью указателя мыши можно отмечать и перетаскивать объекты, рисовать, запускать программы и т. д. Рис. 2.36. Пример проводной и беспроводной мыши с колесом
Мышь
Мышь Несомненно, о таком устройстве, как компьютерная мышь, слышали если не все, то почти все. Создана она была еще в 1970-х годах прошлого века, а теперь стала неотъемлемой частью современного компьютера. Однако в случае ноутбуков классическая мышь обычно заменяется более
Мышь
Мышь Манипулятор мышь был изобретен в 1964 году в Стэндфордском научном институте.Поначалу мышь продвигалась на рынок компьютеров довольно медленно, но в связи с широким распространением GUI(Graphics User Interface – графический интерфейс пользователя) она стала обязательной
Мышь
Мышь Мышей сейчас развелось, я вам скажу, великое множество. В общем, на вкус и цвет товарищей нет, как гласит известная поговорка, так что одному, может быть, подавай только пятикнопочную с колесом прокрутки, а другой, наоборот, любит работать с простой двухкнопочной. Мышки
Клавиатура и мышь
Клавиатура и мышь Не меньшее значение при выборе компьютера имеют клавиатура и мышь, так как пользователь постоянно работает с этими устройствами ввода.Выбор клавиатурыКлавиатуре обычно не уделяется должного внимания при покупке компьютера. Как правило, покупатель