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

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

Жанры

Шрифт:

Здесь реализована пара процедур, первая из которых (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;

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

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

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

Я до сих пор князь. Книга XXII

Дрейк Сириус
22. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор князь. Книга XXII

Тринадцатый XII

NikL
12. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
7.00
рейтинг книги
Тринадцатый XII

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Идеальный мир для Демонолога 10

Сапфир Олег
10. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 10

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Слово мастера

Лисина Александра
11. Гибрид
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Слово мастера

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Копиист

Поселягин Владимир Геннадьевич
2. Рунный маг
Фантастика:
фэнтези
7.26
рейтинг книги
Копиист

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

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