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

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

Жанры

Шрифт:

Для определения координат мыши использовалась 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;

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

За Горизонтом

Вайс Александр
8. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
За Горизонтом

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

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

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

Гром над Академией. Часть 1

Машуков Тимур
2. Гром над миром
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Гром над Академией. Часть 1

Искатель 6

Шиленко Сергей
6. Валинор
Фантастика:
рпг
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Искатель 6

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

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

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

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

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

Мусорщик

Поселягин Владимир Геннадьевич
3. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.55
рейтинг книги
Мусорщик

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Фиктивный брак

Завгородняя Анна Александровна
Фантастика:
фэнтези
6.71
рейтинг книги
Фиктивный брак

Сын Тишайшего 3

Яманов Александр
3. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Сын Тишайшего 3

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень