Чтение онлайн

на главную - закладки

Жанры

Программирование в X Window средствами Free Pascal

Семериков С. А.

Шрифт:

• 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;

Поделиться:
Популярные книги

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Последний Паладин. Том 11

Саваровский Роман
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 11

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Звездная Кровь. Экзарх I

Рокотов Алексей
1. Экзарх
Фантастика:
боевая фантастика
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Экзарх I

Идеальный мир для Лекаря 11

Сапфир Олег
11. Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 11

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Идеальный мир для Лекаря 30

Сапфир Олег
30. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 30

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6