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

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

Жанры

Шрифт:

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

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

"Самая страшная книга-4". Компиляция. Книги 1-16

Коллектив авторов
Самая страшная книга
Фантастика:
городское фэнтези
мистика
ужасы и мистика
5.00
рейтинг книги
Самая страшная книга-4. Компиляция. Книги 1-16

Долгое прощание (сборник)

Кристи Агата
Бестселлер
Детективы:
прочие детективы
5.00
рейтинг книги
Долгое прощание (сборник)

Сталин

Радзинский Эдвард Станиславович
3. Загадки жизни и смерти
Проза:
историческая проза
7.36
рейтинг книги
Сталин

Собрание сочинений (Том 1)

Лиханов Альберт Анатольевич
Детские:
прочая детская литература
5.00
рейтинг книги
Собрание сочинений (Том 1)

Стёртые буквы

Первушина Елена Владимировна
Фантастика:
фэнтези
6.25
рейтинг книги
Стёртые буквы

Остров

Колосов Дмитрий
1. Атланты
Фантастика:
научная фантастика
6.25
рейтинг книги
Остров

Мир приключений 1971 г.

Булычев Кир
Альманах "Мир приключений"
Фантастика:
научная фантастика
7.00
рейтинг книги
Мир приключений 1971 г.

Дважды одаренный. Том VIII

Тарс Элиан
8. Дважды одаренный
Фантастика:
боевая фантастика
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том VIII

Магистр. Трилогия

Степанов Николай Викторович
Магистр [Воронцов]
Фантастика:
научная фантастика
7.00
рейтинг книги
Магистр. Трилогия

1759. Год завоевания Британией мирового господства

Маклинн Фрэнк
Научно-образовательная:
история
4.00
рейтинг книги
1759. Год завоевания Британией мирового господства

Приключения Оливера Твиста. Повести и рассказы

Диккенс Чарльз
82. Библиотека всемирной литературы
Проза:
классическая проза
8.85
рейтинг книги
Приключения Оливера Твиста. Повести и рассказы

Собрание сочинений. Т. 20. Плодовитость

Золя Эмиль
Проза:
классическая проза
5.00
рейтинг книги
Собрание сочинений. Т. 20. Плодовитость

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

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

Беспощадный. Не русские идут

Головачев Василий Васильевич
3. Большая серия русской фантастики
Фантастика:
боевая фантастика
5.00
рейтинг книги
Беспощадный. Не русские идут