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

на главную

Жанры

Шрифт:

Здесь реализована пара процедур, первая из которых (SetCursorRect) ограничивает перемещение указателя мыши заданной областью экрана (параметр newRect). Перед ограничением на перемещение указателя в процедуре SetCursorRect происходит сохранение области перемещения, установленной ранее, чтобы действие процедуры можно было отменить. Для отмены ограничения перемещения указателя служит вторая процедура – RestoreCursorRect.

...

Примечание

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

Изменение назначения кнопок мыши

Как

известно, операционная система Windows дает возможность работать за компьютером широкому кругу людей. Со стороны разработчиков было бы глупо не предусмотреть возможность простой адаптации манипулятора «мышь» к правше или левше. К тому же мышь адаптировать к таким различиям намного проще: конструкцию изменять не надо, достаточно программно поменять функции кнопок мыши.

Как поменять функции левой и правой кнопок мыши, демонстрирует листинг 3.7.

...

Листинг 3.7.

Изменение назначения кнопок мыши

procedure TForm1.Button1Click(Sender: TObject);

begin

//Меняем местами функции левой и правой кнопок мыши

SwapMouseButton(True);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

//Восстанавливаем функции кнопок мыши

SwapMouseButton(False);

end;

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

Подсчет расстояния, пройденного указателем мыши

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

Рис. 3.1. Программа измерения пробега указателя мыши

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

Теперь приступим к рассмотрению реализации этого приложения. В табл. 3.1 приводятся сведения по настройке элементов управления, не являющихся рамками или статическими надписями.

Таблица 3.1. Параметры элементов управления формы, показанной на рис. 3.1

В листинге 3.8 приводятся объявления переменных (членов класса TForml) и методов, добавленных вручную.

...

Листинг 3.8. Форма для измерения пробега указателя

type

TForm1 = class(TForm)

private

isUpdating: Boolean; //Если равен False, то показания

//в txtDistance

//не обновляются

lastPos: TPoint; //Координаты указателя во время

//прошлого замера

distance: Real; //Пройденное расстояние в пикселах

procedure StartUpdating;

procedure StopUpdating;

procedure ShowDistance;

end;

Суммарное расстояние в пикселах, пройденное указателем, сохраняется в переменной distance. Рассмотрим, как осуществляется перевод этого расстояния в метры (листинг 3.9).

...

Листинг 3.9. Перевод расстояния в метры с учетом масштаба

procedure TForm1.ShowDistance;

var

scale: Real;

distanceMetters: Real;

begin

//Пересчитываем текущий пробег в метры и показываем его

//в текстовом поле

//..определяем масштаб для перевода измерений в метры

scale := 0.001 * StrToInt(txtWidth.Text) / Shape1.Width;

//..подсчитываем расстояние с учетом масштаба

distanceMetters := scale * distance;

//..округляем до трех знаков (мм) и показываем

distanceMetters := Int(distanceMetters * 1000) * 0.001;

txtDistance.Text := FloatToStr(distanceMetters);

end;

В приведенном расчете нет ничего сложного, как, собственно, нет ничего сложного и во всем примере. Главная процедура приложения – обработчик для таймера Timerl. Таймер срабатывает с максимальной для него частотой (не 1 мс, конечно, но где-то 18 раз в секунду). Текст обработчикаТ1тег1Т1тег приводится в листинге 3.10.

...

Листинг 3.10. Подсчет разницы между положениями указателя мыши

procedure TForm1.Timer1Timer(Sender: TObject);

var

curPos: TPoint;

delta: Real;

begin

if (curPos.X <> lastPos.X) or (curPos.Y <> lastPos.Y) then

begin

GetCursorPos(curPos);

//Вычисляем разницу между текущим и прошлым

//положением мыши

delta := Sqrt(Sqr(curPos.X – lastPos.X) + Sqr(curPos.Y -

lastPos.Y));

distance := distance + delta;

//Не забываем сохранить новые координаты указателя

lastPos := curPos;

if isUpdating then

begin

//Обновим показания в текстовом поле

ShowDistance;

end;

end;

end;

Как можно увидеть при внимательном рассмотрении листинга 3.10, обновление показаний происходит при истинном значении переменной isUpdating. Значение этой переменной устанавливается в False во время задания масштаба, чтобы во время ввода значений в текстовые поля не выводились неправильные цифры (листинг 3.11).

...

Листинг 3.11.

Активизация/деактивизация режима ввода масштаба

procedure TForm1.cmbScaleClick(Sender: TObject);

begin

if cmbScale.Caption = \'Изменить масштаб\' then

begin

//Начинаем изменение масштаба

StopUpdating;

cmbScale.Caption := \'Принять масштаб\

txtWidth.Enabled := True;

end

else

begin

//Заканчиваем изменение масштаба

txtWidth.Enabled := False;

cmbScale.Caption := \'Изменить масштаб\

StartUpdating;

end;

end;

Процедуры StartUpdating и StopUpdating скрывают действия, которые необходимо произвести для остановки или возобновления отображения пройденного расстояния в текстовом поле. В нашем примере они выглядят крайне просто (листинг 3.12).

...

Листинг 3.12.

Включение/выключение обновления результатов измерения

procedure TForm1.StartUpdating;

begin

//Включаем обновление показаний в текстовом поле

isUpdating := True;

end;

procedure TForm1.StopUpdating;

begin

//Отключаем обновление показаний в текстовом поле

isUpdating := False;

end;

В завершение остается реализовать код инициализации при запуске программы и обработчик события Click для кнопки cmbClear (листинг 3.13).

...

Листинг 3.13.

Инициализация при запуске и код сброса счетчика

procedure TForm1.FormCreate(Sender: TObject);

begin

//Инициализируем координаты мыши

GetCursorPos(lastPos);

StartUpdating;

end;

procedure TForm1.cmbClearClick(Sender: TObject);

begin

//Сбрасываем счетчик пройденного расстояния

distance := 0;

GetCursorPos(lastPos); //Начинаем отсчет с текущей

//позиции указателя

ShowDistance;

end;

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

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств

Отборная бабушка

Мягкова Нинель
Фантастика:
фэнтези
юмористическая фантастика
7.74
рейтинг книги
Отборная бабушка

Измена. Ребёнок от бывшего мужа

Стар Дана
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Ребёнок от бывшего мужа

Неверный. Свободный роман

Лакс Айрин
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Неверный. Свободный роман

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

В теле пацана 6

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

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Инферно

Кретов Владимир Владимирович
2. Легенда
Фантастика:
фэнтези
8.57
рейтинг книги
Инферно

Золушка вне правил

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.83
рейтинг книги
Золушка вне правил