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

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

Жанры

Шрифт:

Для определения координат мыши использовалась API-функция GetCursorPos. Передав в эту функцию переменную pt типа ТPoint, мы получим текущие экранные координаты указателя.

Рассмотрим пример, в котором указатель мыши при нажатии кнопки Button2 скрывается, а при нажатии кнопки Button3 (например, при помощи клавиатуры) показывается (листинг 3.3).

...

Листинг 3.3.

Скрытие указателя мыши

procedure MouseForm.Button2Click(Sender: TObject);

begin

//Прячем указатель

ShowCursor(False);

end;

procedure MouseForm.Button3Click(Sender: TObject);

begin

//Показываем указатель

ShowCursor(True);

end;

В приведенном примере для управления видимостью указателя мыши используется функция ShowCursor, которая либо скрывает его (принимая значение False), либо снова показывает (принимая значение True). По причине того что указатель может скрываться и управление мышью будет невозможно, исходный текст, осуществляющий управление видимостью указателя, помещен в обработчики нажатия кнопок формы. В то время, когда указатель будет скрыт, можно использовать клавишу Tab для выбора и нажатия кнопки.

Существуют и другие способы скрыть указатель. Рассмотрим пример управления его видимостью посредством установки свойства Cursor компонента:

...

TempForm.Cursor := crNone;

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

...

Screen.Cursor := crNone;

Мышь можно передвигать и программным путем. Следующий пример демонстрирует, каким образом это можно сделать (листинг 3.4).

...

Листинг 3.4.

Изменение координат мыши

procedure TForm1.Button1Click(Sender: TObject);

var

pt : TPoint;

begin

Application.ProcessMessages;

Screen.Cursor := CrHourglass;

GetCursorPos(pt);

SetCursorPos(pt.x + 1, pt.y + 1);

Application.ProcessMessages;

SetCursorPos(pt.x – 1, pt.y – 1);

end;

Захват указателя мыши

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

Захват указателя полезен и в других случаях, потому мы рассмотрим, как его реализовать (а сделать это действительно просто). В листинге 3.5 приводятся обработчики нажатия и отпускания кнопки мыши, которые реализуют захват указателя на время от нажатия до отпускания кнопки.

...

Листинг 3.5.

Захват и освобождение указателя мыши

procedure TForm1.FormMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

//Захватываем указатель мыши

SetCapture(Handle);

end;

procedure TForm1.FormMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

//Отменяем захват указателя

ReleaseCapture;

end;

Вся хитрость состоит в использовании API-функций захвата SetCapture, а также ReleaseCapture. При вызове первой функции происходит регистрация окна, которое захватывает указатель мыши: окно будет получать сообщения от мыши даже тогда, когда указатель будет находиться за его пределами. Функция возвращает дескриптор окна, которое захватило указатель ранее, либо 0, если такого окна нет. Соответственно, функция ReleaseCapture используется для отмены захвата указателя.

...

Примечание

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

Можно также упомянуть о API-функции GetCapture. Функция не принимает аргументов и возвращает дескриптор окна, захватившего указатель ранее. С помощью этой функции можно, например, удостовериться, что захватом указателя мыши мы не нарушим работу другого приложения (что маловероятно).

Ограничение перемещения указателя

При помощи несложных манипуляций можно также ограничить перемещение указателя мыши определенной областью экрана (прямоугольником). Для этого используется API-функция ClipCursor. Она принимает в качестве параметра структуру TRect с координатами прямоугольника, в пределах которого может перемещаться указатель, и в случае успешной установки ограничения возвращает отличное от нуля значение.

С ClipCursor тесно связана функция GetClipCursor, позволяющая получить координаты прямоугольника, которым в данный момент ограничено перемещение указателя.

Использование функций ClipCursor и GetClipCursor приведено в листинге 3.6.

...

Листинг 3.6.

Ограничение перемещения указателя

var

lastRect: TRect;

cursorClipped: Boolean = False;

procedure SetCursorRect(newRect: TRect);

begin

if not cursorClipped then

begin

//Сохраняем старую область перемещения указателя

GetClipCursor(lastRect);

//Устанавливаем ограничение на перемещения указателя

cursorClipped := ClipCursor(Addr(newRect)) <> False;

end;

end;

procedure RestoreCursorRect;

begin

if cursorClipped then

begin

//Восстанавливаем область перемещения указателя

cursorClipped := ClipCursor(Addr(lastRect)) = False;

end;

end;

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

Эпоха Опустошителя. Том X

Павлов Вел
10. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том X

Одержимый

Джеймс Питер
Top Thriller
Детективы:
триллеры
маньяки
8.67
рейтинг книги
Одержимый

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Вагант

Листратов Валерий
6. Ушедший Род
Фантастика:
боевая фантастика
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Вагант

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Подросток

Достоевский Федор Михайлович
Проза:
русская классическая проза
9.09
рейтинг книги
Подросток

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

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

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

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Хозяин Теней 6

Петров Максим Николаевич
6. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 6

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4