...
Листинг 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;
Вот, собственно, и все, что нужно для работы рассматриваемой программы. Остается лишь уточнить, что способ установки масштаба, используемый в программе, предназначен для таких разрешений мониторов, при которых нет искажений по горизонтали или вертикали. Чаще всего это такие разрешения, при которых размеры изображения по горизонтали и вертикали подчиняются пропорции 4:3 (640 х 480, 800 х 600 и т. д.). При этом такими же пропорциями должен обладать экран монитора.
Подсвечивание элементов управления
В завершение рассмотрим несложный, но достаточно полезный пример, позволяющий сделать более «живым» интерфейс приложения: изменение внешнего вида элементов управления при наведении на них указателя мыши.
В листинге 3.14 показано, как можно сделать статическую надпись похожей на гиперссылку (для большего эффекта для такой надписи можно установить свойство Cursor равным crHandPoint на этапе проектирования формы).
...
Листинг 3.14.
Подчеркивание и изменение цвета надписи
procedure TForm1.lblUnderlineMouseEnter(Sender: TObject);
begin
lblUnderline.Font.Style := [fsUnderline];
lblUnderline.Font.Color := RGB(0, 0, 255);
end;
procedure TForm1.lblUnderlineMouseLeave(Sender: TObject);
begin
lblUnderline.Font.Style := [];
lblUnderline.Font.Color := RGB(0, 0, 0);
end;
Осталось добавить обработчик события Click для надписи, и получится довольно правдоподобная гиперссылка, правда, выполнять она может любое действие.
Начертание шрифта можно также изменить для стандартной кнопки. Как это можно сделать, показано в листинге 3.15.
...
Листинг 3.15.
Изменение начертания шрифта
procedure TForm1.cmbItalicBoldMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
cmbItalicBold.Font.Style := [fsItalic, fsBold];
Читать дальше
Конец ознакомительного отрывка
Купить книгу